我有一个迭代算法,它根据以前更新的参数重复相同的过程,并尝试估计整个算法的经过时间。
因此,我测量单次迭代的计算时间(比如time1iter
),并通过将其乘以总迭代时间(nIter * time1iter
)来估计总时间。
但是,我发现我的估计和实际时间之间存在巨大差异。例如,估计的时间约为8分钟,但不到6分钟。
我想知道
我附上了一个玩具示例,你可以在这里找到这个"高估"。
size <- 1000
nIter <- 100
## A single iteration
s_time <- Sys.time()
tmp <- matrix(rnorm(size^2), size, size)
ss <- 0
for(i in 1:size){
for(j in 1:size){
ss <- ss + tmp[i,j]
}
}
time1iter <- difftime(Sys.time(), s_time, units = "secs")
cat(sprintf("Expected time for %d iterations is %3.f secs\n",
nIter, time1iter * nIter))
## Main iterations
s_time <- Sys.time()
for(iter in 1:nIter){
tmp <- matrix(rnorm(size^2), size, size)
ss <- 0
for(i in 1:size){
for(j in 1:size){
ss <- ss + tmp[i,j]
}
}
}
cat(sprintf("Actual elapsed time is %.3f secs\n",
difftime(Sys.time(), s_time, units = "secs")))
我的结果是
100次迭代的预期时间为17秒
实际经过时间为12.948秒
答案 0 :(得分:2)
如果我们使用越来越多的迭代次数运行循环,我们会在时间和迭代次数之间得到一个非常线性的关系:
res = data.frame(nIter = seq(1,101,10), time=NA)
for (ni in 1:10){
nIter <- res[ni, 'nIter']
s_time <- Sys.time()
for(iter in 1:nIter){
tmp <- matrix(rnorm(size^2), size, size)
ss <- 0
for(i in 1:size){
for(j in 1:size){
ss <- ss + tmp[i,j]
}
}
}
res[ni, 'time'] <- difftime(Sys.time(), s_time, units = "secs")
}
library(ggplot2)
ggplot(res, aes(nIter, time)) +
geom_smooth()
小拦截与解释循环的开销,获取和打印时间等相关。换句话说,这似乎表现得像人们期望的那样
lm(time ~ nIter, data = res)
Coefficients:
(Intercept) nIter
0.009067 0.165585