for循环的速度正在下降

时间:2014-02-23 22:13:06

标签: r for-loop

我正在循环遍历大型数据集,我发现更高的循环索引,循环越慢。一开始它的速度非常快,但最后却非常缓慢。这是什么原因?有没有办法绕过它?

说明: 1)我不能使用plyr,因为计算是递归的。 2)输出矢量的长度事先不知道。

我的代码看起来像这样粗鲁:

  for (i in 1:20000){

     if(i == 1){

        temp <- "some function"(input data[i])
        output <- temp

     } else {

       temp <- "some function"(input data[i], temp)
       out <- rbind(out, temp)
     }    
  }

1 个答案:

答案 0 :(得分:4)

问题是你在每次迭代时都在增长对象out,随着out的大小增加(随着循环索引的增加),这将需要越来越大的复制量。

在这种情况下,您知道循环需要一个20000个元素的向量,因此最初创建一个并在循环时填充该对象。这样做也将消除对if() ... else()的需求,这也会减慢你的循环,并且随着循环的大小增加而变得明显。

例如,你可以这样做:

out <- numeric(20000)
out[1] <- foo(data[1])
for (i in 2:length(out)) {
  out[i] <- foo(data[i], out[i-1])
}

创建它时需要的out取决于foo()返回的内容。相应地调整out的创建。