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