我正在循环遍历大型数据集,我发现更高的循环索引,循环越慢。一开始它的速度非常快,但最后却非常缓慢。这是什么原因?有没有办法绕过它?
说明:
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)
}
}
答案 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
的创建。