Hai già una risposta su come utilizzare più di un core, ma il vero problema è con il modo in cui hai scritto i tuoi loop. Non estendere mai il vettore / oggetto del risultato ad ogni iterazione di un ciclo . Se lo fai, imponi a R di copiare il tuo vettore / oggetto risultato e di estenderlo, il che richiede tempo. Invece, preallocate abbastanza spazio di archiviazione prima di avviare il ciclo e compilare mentre procedete. Ecco un esempio:
set.seed(1)
p1 <- matrix(rnorm(10000), ncol=100)
system.time({
p1max <- p1mean <- p1sum <- numeric(length = 100)
for(i in seq_along(p1max)){
p1max[i] <- max(p1[i,])
p1mean[i] <- mean(p1[i,])
p1sum[i ]<- sum(p1[i,])
}
})
user system elapsed
0.005 0.000 0.005
Oppure puoi fare queste cose tramite apply():
system.time({
p1max2 <- apply(p1, 1, max)
p1mean2 <- apply(p1, 1, mean)
p1sum2 <- apply(p1, 1, sum)
})
user system elapsed
0.007 0.000 0.006
Ma nota che questo non è più veloce del fare il loop correttamente e talvolta più lentamente.
Tuttavia, cerca sempre il codice vettoriale. Puoi fare somme di riga e significa usare rowSums()e rowMeans()che sono più veloci del ciclo o delle applyversioni:
system.time({
p1max3 <- apply(p1, 1, max)
p1mean3 <- rowMeans(p1)
p1sum3 <- rowSums(p1)
})
user system elapsed
0.001 0.000 0.002
Se fossi un uomo di scommesse, avrei denaro sul terzo approccio che menziono battendo foreach()o le altre opzioni multi-core in un test di velocità sulla tua matrice perché dovrebbero accelerare notevolmente le cose per giustificare il sovraccarico sostenuto nell'impostare il processi separati che vengono estrapolati dai diversi core della CPU.
Aggiornamento: seguendo il commento di @shabbychef è più veloce fare le somme una volta e riutilizzarle nel calcolo della media?
system.time({
p1max4 <- apply(p1, 1, max)
p1sum4 <- rowSums(p1)
p1mean4 <- p1sum4 / ncol(p1)
})
user system elapsed
0.002 0.000 0.002
Non in questo test, ma questo è lungi dall'essere esaustivo ...