Vous avez déjà une réponse sur la façon d'utiliser plus d'un cœur, mais le vrai problème est avec la façon dont vous avez écrit vos boucles. N'étendez jamais votre vecteur / objet résultant à chaque itération d'une boucle . Si vous faites cela, vous forcez R à copier votre vecteur / objet de résultat et à l'étendre, ce qui prend du temps. Au lieu de cela, préallouez suffisamment d'espace de stockage avant de démarrer la boucle et remplissez-la au fur et à mesure. Voici un exemple:
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
Ou vous pouvez faire ces choses via 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
Mais notez que ce n'est pas plus rapide que de faire la boucle correctement et parfois plus lentement.
Cependant, soyez toujours à la recherche de code vectorisé. Vous pouvez faire des sommes et des moyens de ligne en utilisant rowSums()et rowMeans()qui sont plus rapides que la boucle ou les applyversions:
system.time({
p1max3 <- apply(p1, 1, max)
p1mean3 <- rowMeans(p1)
p1sum3 <- rowSums(p1)
})
user system elapsed
0.001 0.000 0.002
Si j'étais un homme de paris, j'aurais de l'argent sur la troisième approche que je mentionne battre foreach()ou les autres options multi-core dans un test de vitesse sur votre matrice, car ils devraient accélérer considérablement les choses pour justifier les frais généraux engagés dans la mise en place du des processus séparés qui sont développés sur les différents cœurs de CPU.
Mise à jour: Suite au commentaire de @shabbychef, est-il plus rapide de faire les sommes une fois et de les réutiliser dans le calcul de la moyenne?
system.time({
p1max4 <- apply(p1, 1, max)
p1sum4 <- rowSums(p1)
p1mean4 <- p1sum4 / ncol(p1)
})
user system elapsed
0.002 0.000 0.002
Pas dans ce test, mais c'est loin d'être exhaustif ...