sapply与复合函数的速度比较

时间:2011-01-05 02:10:09

标签: r performance runtime

> system.time(sapply(rnorm(1000000,0,1), function (x) round(x,2)))
   user  system elapsed 
   2.78    0.11    2.89 
> system.time(round(rnorm(1000000,0,1),2))
   user  system elapsed 
   0.29    0.00    0.30 

在阅读了R提示问题的答案后,我正在尝试这个。在上述情况下,我没想到蓝色比等效复合函数慢几个数量级。有谁知道为什么会这样?如果我理解正确,那么矢量化并接近最佳速度。

2 个答案:

答案 0 :(得分:5)

可能是sapply,这是一个简单的lapply包装器,没有矢量化。试试这段代码:

system.time(sapply(rnorm(10), function (x) {print(length(x)); round(x,2)}))

并在此处查看实施:https://svn.r-project.org/R/trunk/src/main/apply.c

答案 1 :(得分:2)

这里没有任何内容可供选择 - 你只给它一个向量 - 而不是向量列表,并将结果转换为(单列)矩阵。

sapply正在为您简化结果,但这样做必须生成一个数组。

比较你是否给它一个列表:

system.time(sapply(list(rnorm(1000000,0,1)), function (x) round(x,2))) 
user  system elapsed 
 0.22    0.00    0.22 

system.time(sapply(rnorm(1000000,0,1), function (x) round(x,2))) 
user  system elapsed 
4.21    0.00    4.21