Birden fazla çekirdeğin nasıl kullanılacağına dair zaten bir cevabınız var, ancak asıl sorun döngülerinizi yazma şekliniz. Sonuç vektörünüzü / nesnenizi bir döngünün her yinelemesinde asla uzatmayın . Bunu yaparsanız, R'yi sonuç vektörünüzü / nesneyi kopyalamaya ve her şeyin zaman alacağı şekilde genişletmeye zorlarsınız. Bunun yerine, döngüye başlamadan önce yeterli depolama alanını önceden konumlandırın ve ilerledikçe doldurun. İşte bir örnek:
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
Veya bunları şu yollarla yapabilirsiniz 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
Ama bunun hiçbir hızlı düzgün ve bazen yavaş döngü işini halletmek.
Bununla birlikte, her zaman vectorized kod arayışında olun. Sen kullanarak satır toplamlarını ve araçları yapabilir rowSums()
ve rowMeans()
daha hızlı döngü veya ikisinden de hangi apply
sürümleri:
system.time({
p1max3 <- apply(p1, 1, max)
p1mean3 <- rowMeans(p1)
p1sum3 <- rowSums(p1)
})
user system elapsed
0.001 0.000 0.002
Bahis yapan bir adam olsaydım, dövmekten bahsettiğim üçüncü yaklaşıma param olurdu foreach()
, matrisinizdeki bir hız testinde veya diğer çok çekirdekli seçeneklerden çünkü farklı işlemcilerin çekirdeğini oluşturan ayrı işlemler.
Güncelleme: @shabbychef'in yorumunu takiben, toplamları bir kez yapmak ve ortalamanın hesaplanmasında tekrar kullanmak daha hızlı mı?
system.time({
p1max4 <- apply(p1, 1, max)
p1sum4 <- rowSums(p1)
p1mean4 <- p1sum4 / ncol(p1)
})
user system elapsed
0.002 0.000 0.002
Bu test çalışmasında değil, ama bu kapsamlı olmaktan uzak ...