R

时间:2018-05-29 16:12:10

标签: r iteration computation elapsedtime

我有一个迭代算法,它根据以前更新的参数重复相同的过程,并尝试估计整个算法的经过时间。

因此,我测量单次迭代的计算时间(比如time1iter),并通过将其乘以总迭代时间(nIter * time1iter)来估计总时间。

但是,我发现我的估计和实际时间之间存在巨大差异。例如,估计的时间约为8分钟,但不到6分钟。

我想知道

  1. 一般造成这种差距的原因,
  2. 我如何正确估计迭代过程所用的时间。
  3. 我附上了一个玩具示例,你可以在这里找到这个"高估"。

    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秒

1 个答案:

答案 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()

enter image description here

小拦截与解释循环的开销,获取和打印时间等相关。换句话说,这似乎表现得像人们期望的那样

lm(time ~ nIter, data = res)    
Coefficients:
(Intercept)        nIter  
   0.009067     0.165585