Se si dispone di una macchina multicore ci sono alcuni guadagni da utilizzare tutti i core, ad esempio utilizzando mclapply
.
> 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
Questo mini esempio mostra che le cose vanno come pianificato. Ora scalare:
> M <- matrix(rnorm(1e7), nrow=20)
> system.time(invisible(apply(M, 2, t.test)))
user system elapsed
101.346 0.626 101.859
> system.time(invisible(mclapply(1:dim(M)[2], function(i) t.test(M[,i]))))
user system elapsed
55.049 2.527 43.668
Questo sta utilizzando 8 core virtuali. Il tuo chilometraggio può variare. Non è un guadagno enorme, ma viene da un piccolo sforzo.
EDIT
Se vi interessa soltanto la statistica t per sé, l'estrazione del campo corrispondente ($statistic
) rende le cose un po 'più veloce, in particolare nel caso multicore:
> 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
Or ancora più veloce, calcolare il valore t direttamente
my.t.test <- function(c){
n <- sqrt(length(c))
mean(c)*n/sd(c)
}
Poi
> 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' è una funzione molto flessibile e quindi include molte cose che non ti servono in nessun caso particolare. Probabilmente codificando la stessa logica manualmente con il ciclo 'for' si otterrà un aumento delle prestazioni. – ffriend