Ya tiene una respuesta sobre cómo usar más de un núcleo, pero el verdadero problema es la forma en que ha escrito sus bucles. Nunca extienda su vector / objeto de resultado en cada iteración de un bucle . Si haces esto, obligas a R a copiar tu vector / objeto de resultado y lo extiendes, lo que lleva tiempo. En su lugar, asigne previamente suficiente espacio de almacenamiento antes de comenzar el ciclo y complete a medida que avanza. Aquí hay un ejemplo:
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
O puede hacer estas cosas a travé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
Pero tenga en cuenta que esto no es más rápido que hacer el bucle correctamente y, a veces, más lento.
Sin embargo, siempre esté atento al código vectorizado. Puede hacer sumas de filas y medios usando rowSums()y rowMeans()que son más rápidos que el bucle o las applyversiones:
system.time({
p1max3 <- apply(p1, 1, max)
p1mean3 <- rowMeans(p1)
p1sum3 <- rowSums(p1)
})
user system elapsed
0.001 0.000 0.002
Si fuera un apostador, tendría dinero en el tercer enfoque que menciono golpear foreach()u otras opciones multinúcleo en una prueba de velocidad en su matriz porque tendrían que acelerar las cosas considerablemente para justificar los gastos generales incurridos al configurar el procesos separados que se cultivan en los diferentes núcleos de CPU.
Actualización: Siguiendo el comentario de @shabbychef, ¿es más rápido hacer las sumas una vez y reutilizarlas en el cálculo de la media?
system.time({
p1max4 <- apply(p1, 1, max)
p1sum4 <- rowSums(p1)
p1mean4 <- p1sum4 / ncol(p1)
})
user system elapsed
0.002 0.000 0.002
No en esta prueba, pero esto está lejos de ser exhaustivo ...