【发布时间】:2013-05-29 23:13:28
【问题描述】:
我学习 R 已经有一段时间了,并且遇到了很多关于像我这样的编程类型来矢量化操作的建议。作为一名程序员,我对它为什么/如何更快感兴趣。一个例子:
n = 10^7
# populate with random nos
v=runif(n)
system.time({vv<-v*v; m<-mean(vv)}); m
system.time({for(i in 1:length(v)) { vv[i]<-v[i]*v[i] }; m<-mean(vv)}); m
这给了
user system elapsed
0.04 0.01 0.07
[1] 0.3332091
user system elapsed
36.68 0.02 36.69
[1] 0.3332091
要考虑的最明显的事情是我们正在运行本机代码,即从 C 或 C++ 编译的机器代码,而不是解释代码,这可以从两个示例之间的用户时间的巨大差异(大约 3 个数量级震级)。但还有其他事情发生吗?例如,R 是否:
巧妙的原生数据结构,例如存储稀疏向量或矩阵的巧妙方法,以便我们只在需要时进行乘法运算?
惰性求值,例如在矩阵乘法上,不要在需要时才计算单元格。
并行处理。
别的东西。
为了测试是否可能存在一些稀疏向量优化,我尝试使用不同向量内容进行点积
# populate with random nos
v<-runif(n)
system.time({m<-v%*%v/n}); m
# populate with runs of 1 followed by 99 0s
v <-rep(rep(c(1,rep(0,99)),n/100))
system.time({m<-v%*%v/n}); m
# populate with 0s
v <-rep(0,n)
system.time({m<-v%*%v/n}); m
但是时间上没有显着差异(大约经过 0.09)
(Matlab 的类似问题:Why does vectorized code run faster than for loops in MATLAB?)
【问题讨论】:
标签: r vectorization