我认为我需要将其作为一个完整的答案,因为我发现评论更难追踪,而且我已经失去了对此的评论...... nullglob的一个例子展示了 for 之间的差异,并且比其他例子更好地应用家庭函数. 当一个函数使得它非常慢时,这就是所有速度都被消耗的地方,你不会发现循环变化之间的差异。但是,当您使函数变得微不足道时,您可以看到循环对事物的影响有多大。
我还想补充一点,在其他示例中未探索的应用系列的一些成员具有有趣的性能属性。首先,我将在我的机器上显示 nullglob 的相关结果的复制。
n <- 1e6
system.time(for(i in 1:n) sinI[i] <- sin(i))
user system elapsed
5.721 0.028 5.712
lapply runs much faster for the same result
system.time(sinI <- lapply(1:n,sin))
user system elapsed
1.353 0.012 1.361
他还发现 sapply 慢得多。这是其他一些未经测试的。
普通旧适用于数据的矩阵版本......
mat <- matrix(1:n,ncol =1),1,sin)
system.time(sinI <- apply(mat,1,sin))
user system elapsed
8.478 0.116 8.531
因此,apply() 命令本身比 for 循环慢很多。(如果我使用 sin(mat[i,1]),for 循环不会明显减慢。
另一个似乎没有在其他帖子中测试过的另一个是 tapply。
system.time(sinI <- tapply(1:n, 1:n, sin))
user system elapsed
12.908 0.266 13.589
当然,人们永远不会以这种方式使用 tapply,而且在大多数情况下,它的实用性远远超出了任何此类速度问题。