【发布时间】: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