你这里的apply做了 5 * 16 * 100 * 100 次sum计算,
for只做了 2 次向量加法,
colSums直接在底层的数据结构上操作,不会做这个取子集的操作。
由于向量加法和colSums都是底层的操作,和apply没有可比性,我认为要让for和apply站在同一个起跑线上才可比。
<br />
library(rbenchmark)<br />
benchmark(<br />
{<br />
y <- array(dim = c(15, 6, 100, 100))<br />
for(i in 1:15)<br />
for(j in 1:6)<br />
for(a in 1:100)<br />
for(b in 1:100)<br />
y[i, j, a, b] <- sum(x[, i, j, a, b])<br />
},<br />
apply(x,c(2,3,4,5),sum),<br />
replications = 10<br />
)<br />
</p>
如果换成在第五维求和,这三种方法都会快很多(我的理解是matrix的最后一维数据是连续的,所以求和操作变成了一个局部的操作,相比之前需要跨越巨大的存储空间,cache利用率能高很多)。
<br />
library(rbenchmark)</p>
<p>x<-array(1:(1800000),c(2,15,6,100,100))</p>
<p>benchmark(<br />
{ y<-0; for(i in 1:2) y<-y+x[i,,,,] },<br />
apply(x,c(2,3,4,5),sum),<br />
colSums(x,dims=1),<br />
replications = 10<br />
)</p>
<p>benchmark(<br />
{ y<-0; for(i in 1:2) y<-y+x[,,,,i] },<br />
apply(x,c(1, 2, 3, 4),sum),<br />
rowSums(x, dims=4),<br />
replications = 10<br />
)<br />
</p>