Bir çok çekirdekli makinen varsa mclapply
kullanarak örneğin, tüm çekirdekleri kullanarak bazı kazançlar vardır.
> library(multicore)
> M <- matrix(rnorm(40),nrow=20)
> x1 <- apply(M, 2, t.test)
> x2 <- mclapply(1:dim(M)[2], function(i) t.test(M[,i]))
> all.equal(x1, x2)
[1] "Component 1: Component 9: 1 string mismatch" "Component 2: Component 9: 1 string mismatch"
# str(x1) and str(x2) show that the difference is immaterial
Bu mini örnek, planların planlandığı gibi devam ettiğini gösterir. Şimdi ölçeklendirin:
8 sanal çekirdek kullanıyor. Yolculuğunuz değişebilir. Büyük bir kazanç değil, ama çok az çabadan geliyor.
DÜZENLEME yalnızca ilgili alanı ($statistic
) ayıklanması, t istatistiğinin kendisi önem veriyorsanız
çok çekirdekli durumunda özellikle biraz daha hızlı şeyler yapar:
> system.time(invisible(apply(M, 2, function(c) t.test(c)$statistic)))
user system elapsed
80.920 0.437 82.109
> system.time(invisible(mclapply(1:dim(M)[2], function(i) t.test(M[,i])$statistic)))
user system elapsed
21.246 1.367 24.107
Ya daha da hızlı, doğrudan
my.t.test <- function(c){
n <- sqrt(length(c))
mean(c)*n/sd(c)
}
Sonra
01 ton değerini hesaplamak
> system.time(invisible(apply(M, 2, function(c) my.t.test(c))))
user system elapsed
21.371 0.247 21.532
> system.time(invisible(mclapply(1:dim(M)[2], function(i) my.t.test(M[,i]))))
user system elapsed
144.161 8.658 6.313
'apply' çok esnek bir işlevdir ve bu nedenle, herhangi bir durumda gerek duymadığınız birçok şeyi içerir. Muhtemelen 'for' döngüsü ile manuel olarak aynı mantığı kodlamak bazı performans artışı verecektir. – ffriend