R | 警惕R中的for循环

2019-05-26  本文已影响0人  尘世中一个迷途小书僮

对于我这种从python中迁移过来的R learner,很容易就会使用for循环处理批量的任务。但是R语言有别于其他的编程语言,它运行for循环处理数据的效果往往难以达到预想中的情况,下面用以下几个例子实测R语言中的循环到底好不好用。

#首先生成一个包含正数和负数的长向量,总共有一千万个数值
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 
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倍

> system.time(abs(long))
用户 系统 流逝 
0.02 0.02 0.03 

R中的自带函数几乎是for循环速度运行的300倍!

所以R中很多basic的函数都是经过多次优化与调试的,在可能的情况下,应该尽量避免对其自带函数的修改。

最后的最后,通过以上例子的展示,我们应该发现了R语言的妙处在于逻辑判断、取子集、元素方式执行,这三种方法的合理运用可以大大提升代码速度。当然,正如题目所言我们应当警惕for循环的使用,而不是摒弃它,合理的使用for循环也有助于代码的运行。

完。

上一篇 下一篇

猜你喜欢

热点阅读