我在循环中运行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中。
答案 0 :(得分: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都会重新评估每个元素的内容,导致你的循环及时爬行。
为循环构造良好可以通过在循环之前分配适当的容器来避免这种情况。