对于我这种从python中迁移过来的R learner,很容易就会使用
for
循环处理批量的任务。但是R语言有别于其他的编程语言,它运行for
循环处理数据的效果往往难以达到预想中的情况,下面用以下几个例子实测R语言中的循环到底好不好用。
- 使用 for 循环取一千万个数值的绝对值,并使用
system.time
函数测量函数运行的时间。
#首先生成一个包含正数和负数的长向量,总共有一千万个数值
long <- rep(c(1,-1), 5000000)
abs_loop <- function(x){
for(i in 1:length(x)){
if(x[i] < 0){
x[i] <- -x[i]
}
}
x
}
> system.time(abs_loop(long))
用户 系统 流逝
1.35 0.01 1.43
- 再使用R中向量化的方式进行上述操作
abs_set <- function(x){
negs <- x<0
x[negs] <- x[negs]*-1
x
}
> system.time(abs_set(long))
用户 系统 流逝
0.22 0.06 0.28
在使用了R中向量化编程的方式(逻辑判断、取子集、元素方式执行)后,速度提升了大约30倍。
- 最后,我们看看R中自带的取绝对值函数
abs
有多快
> system.time(abs(long))
用户 系统 流逝
0.02 0.02 0.03
R中的自带函数几乎是for
循环速度运行的300倍!
所以R中很多basic的函数都是经过多次优化与调试的,在可能的情况下,应该尽量避免对其自带函数的修改。
最后的最后,通过以上例子的展示,我们应该发现了R语言的妙处在于逻辑判断、取子集、元素方式执行,这三种方法的合理运用可以大大提升代码速度。当然,正如题目所言我们应当警惕for
循环的使用,而不是摒弃它,合理的使用for
循环也有助于代码的运行。
完。
网友评论