Você já tem uma resposta sobre como usar mais de um núcleo, mas o verdadeiro problema está na maneira como você escreveu seus loops. Nunca estenda seu vetor / objeto resultante a cada iteração de um loop . Se você fizer isso, forçará R a copiar o vetor / objeto resultante e estendê-lo, o que leva tempo. Em vez disso, pré-aloque espaço de armazenamento suficiente antes de iniciar o loop e preencher à medida que avança. Aqui está um exemplo:
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 você pode fazer essas coisas através de 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
Mas observe que isso não é mais rápido do que fazer o loop corretamente e, às vezes, mais lento.
No entanto, esteja sempre atento ao código vetorizado. Você pode fazer somas e meios de linha usando rowSums()e rowMeans()que são mais rápidos que o loop ou as applyversões:
system.time({
p1max3 <- apply(p1, 1, max)
p1mean3 <- rowMeans(p1)
p1sum3 <- rowSums(p1)
})
user system elapsed
0.001 0.000 0.002
Se eu fosse um apostador, teria dinheiro com a terceira abordagem que menciono bater foreach()ou com as outras opções de múltiplos núcleos em um teste de velocidade em sua matriz, porque elas teriam que acelerar as coisas consideravelmente para justificar a sobrecarga incorrida na configuração do processos separados criados nos diferentes núcleos da CPU.
Atualização: Após o comentário de @shabbychef, é mais rápido fazer as somas uma vez e reutilizar no cálculo da média?
system.time({
p1max4 <- apply(p1, 1, max)
p1sum4 <- rowSums(p1)
p1mean4 <- p1sum4 / ncol(p1)
})
user system elapsed
0.002 0.000 0.002
Não nesta execução de teste, mas isso está longe de ser exaustivo ...