【问题标题】:Increasing computational time at every iteration of the same calculations (R)在相同计算的每次迭代中增加计算时间 (R)
【发布时间】:2017-09-15 07:42:00
【问题描述】:

我正在循环运行 1000 次模拟。所有模拟都应该花费相似的计算时间,因为都是相同的过程,但是我的计算时间是 {6.496, 7.680, 9.464, 10.976, ..., 141.460, 145.276, 143.148}。它们随着时间的推移而严重增加。

我的猜测是,这与时间记忆中没有空间或类似的东西有关,但我对计算机科学知之甚少。我认为我需要在循环中添加一个额外的步骤,在该循环中删除正在使用内存的垃圾(例如在不删除先前计算的情况下进行重置),这应该可以解决这种不必要的时间浪费问题。

我很欣赏这个问题的解决方案,但如果你没有 R 的解决方案,我也会解释为什么会发生这种情况。

我使用的代码是

 ptm <- proc.time()
 init_pars = c(0.8,0.0175,0.1)
 pars=init_pars
 n_it = 50
 M = matrix(nrow=n_it,ncol=3)
 for (i in 1:n_it){
   print(c(pars[1],pars[2],pars[3]))
   n_it = 10
   S=list()
   for (j in 1:n_it){
     rec_tree = reconst_tree(bt=s2$t,pars=pars,tt=15)
     S[[j]] = rec_tree
   }
   pars = mle_dd_setoftrees(S)
   pars = c(pars$lambda,pars$beta,pars$mu)
   M[i,]=c(pars[1],pars[2],pars[3])
   print(proc.time() - ptm)
   ptm <- proc.time()
 }

函数 reconst_tree 创建独立的模拟,mle_dd_setoftrees 从一组模拟计算估计值,然后我将估计值存储在矩阵 M 中。

【问题讨论】:

  • 请发布您当前的代码或最小可重现示例。有关更多信息,请参见此处:stackoverflow.com/help/mcve。
  • 我的猜测是你在循环中增长了一个对象。
  • 您如何存储结果?您是分配了整个向量/列表还是在每个循环中都增加了它的大小,从而有效地复制了整个对象?另外,请阅读stackoverflow.com/questions/2908822/…
  • 您能分享一下循环以便我们提供答案吗?一般来说,R中的循环效率低下。您可以通过使用 lapply、sapply 等进行矢量化来加快速度,使用 Rcpp 在 c++ 中编写代码,或者使用 foreach 和 doMC 并行运行循环。
  • @JackStat 这是一个常见的误解。 R 中的循环并不是低效的。您在循环中执行的操作可能效率低下。 lapply 只是有助于避免其中一些低效率,但它并不比编写良好的 for 循环快。

标签: r


【解决方案1】:

你的代码中有问题的部分是这样的:

 S=list()
   for (j in 1:n_it){
     rec_tree = reconst_tree(bt=s2$t,pars=pars,tt=15)
     S[[j]] = rec_tree
   }

你在这里所做的被称为“增长一个对象”

R 的灵活性的一个折衷是它花费大量时间来决定为对象分配多少内存。每次将元素添加到列表中时,R 都会重新评估每个元素的内容,从而导致您的循环及时进行可怕的爬行。

构造良好的 for 循环可以通过在循环之前分配适当的容器来避免这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 2020-08-09
    • 2021-04-15
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多