为什么循环的执行时间与循环的大小不成比例

时间:2014-03-07 11:31:55

标签: r performance loops

我写了这个"坏"函数(volontary slow)构建向量并测试执行时间:

f <- function(n){
  vec <- c()
  for (i in 1:n) {
    vec <- c(vec, i)
  }
}

我认为如果我将循环的大小乘以10,那么函数的执行时间将按比例增加。但是我们可以看到执行时间根本不成比例,甚至非常优越:

> system.time(f(1e+04))
utilisateur     système      écoulé 
0.14        0.00        0.14 
> system.time(f(1e+05))
utilisateur     système      écoulé 
13.35        0.00       13.49 
> system.time(f(1e+06))

Timing stopped at: 1322.7 0.29 1338.59

也许它是一个基本的计算概念,但我想知道为什么这个循环的执行时间(但我认为它对于循环一般来说是一样的)与循环的大小不成正比? / p>

由于

1 个答案:

答案 0 :(得分:4)

这是由逐渐增长的对象引起的。每次增加对象的大小(vec <- c(vec, i))时,都必须在内存中为新对象分配一个新位置。这涉及分配一组新内存,并将旧对象和新部分复制到新分配的空间中。当对象增长时,该操作变得越来越昂贵。这解释了为什么时间不是线性增长而是呈指数增长:分配复制步骤在新分配空间的大小上不是线性的,因此运行时间也与循环的大小不成线性。