您已经获得了有关如何使用多个内核的答案,但真正的问题是编写循环的方式。切勿在循环的每次迭代中扩展结果向量/对象。如果这样做,则强制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
不在本次测试中,但这远非详尽无遗...