对于如何使用多个内核,您已经得到了答案,但真正的问题在于您编写循环的方式。切勿在循环的每次迭代中扩展结果向量/对象。如果你这样做,你会强制 R 复制你的结果向量/对象并扩展它,这一切都需要时间。相反,在开始循环之前预先分配足够的存储空间并在进行时填写。这是一个例子:
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
或者您可以通过以下方式执行这些操作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
但请注意,这并不比正确执行循环更快,有时甚至更慢。
但是,请始终注意矢量化代码。您可以使用比循环或版本更快的方式进行行求和rowSums()
和均值:rowMeans()
apply
system.time({
p1max3 <- apply(p1, 1, max)
p1mean3 <- rowMeans(p1)
p1sum3 <- rowSums(p1)
})
user system elapsed
0.001 0.000 0.002
如果我是一个赌徒,我会在我提到的第三种方法上赚钱,foreach()
或者在矩阵的速度测试中使用其他多核选项,因为它们必须大大加快速度,以证明设置分离出不同 CPU 内核的独立进程。
更新:根据@shabbychef 的评论,一次求和并在平均值计算中重用是否更快?
system.time({
p1max4 <- apply(p1, 1, max)
p1sum4 <- rowSums(p1)
p1mean4 <- p1sum4 / ncol(p1)
})
user system elapsed
0.002 0.000 0.002
不在此测试运行中,但这远非详尽无遗...