【问题标题】:Why the execution time of a loop is not proportional to the size of the loop为什么循环的执行时间与循环的大小不成正比
【发布时间】:2014-03-07 11:31:54
【问题描述】:

我写了这个“坏”函数(自愿慢)来构建一个向量并测试执行时间:

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

也许这是一个基本的计算概念,但我想知道为什么这个循环的执行时间(但我认为它通常与循环相同)与循环的大小不成比例?

谢谢

【问题讨论】:

    标签: r performance loops


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 2022-01-13
      • 2019-11-13
      • 2015-01-02
      • 2013-10-15
      • 1970-01-01
      相关资源
      最近更新 更多