【发布时间】:2017-08-16 13:56:23
【问题描述】:
以下是一个玩具示例。实际上,我将模拟 6000 次 Monte Carlo 复制的数据,并为每个复制计算 St,并且在每个复制中,l 的长度会很大。如何有效地编写代码以减少运行时间。
time <- c(6,6,6,6,7,9,10,10,11,13,16,17,19,20,22,23,25,32,32,34,35)
cens <- c(1,1,1,0,1,0,1,0,0,1,1,0,0,0,1,1,0,0,0,0,0)
l <- length(time)
n <- NULL
d <- NULL
St <- NULL
n[1] <- sum(time[1]<=time)
d[1] <- sum(time==time[1] & cens==1)
St[1] <- (n[1]-d[1])/n[1]
for(i in 2:l){
if(time[i]==time[i-1]){
n[i] <- n[i-1]
d[i] <- d[i-1]
St[i] <- St[i-1]
} else{
n[i] <- sum(time[i]<=time)
d[i] <- sum(time==time[i] & cens==1)
St[i] <- St[i-1] * ((n[i]-d[i])/n[i])
}
}# end of for loop
fit <- data.frame(ti=time, ni=n, di=d, St )
编辑:生成数据
set.seed(5)
l <- 500
time <- round(runif(l,3,38))
cens <- round(runif(l,0,1))
n <- NULL
d <- NULL
St <- NULL
n[1] <- sum(time[1]<=time)
d[1] <- sum(time==time[1] & cens==1)
St[1] <- (n[1]-d[1])/n[1]
for(i in 2:l){
if(time[i]==time[i-1]){
n[i] <- n[i-1]
d[i] <- d[i-1]
St[i] <- St[i-1]
} else{
n[i] <- sum(time[i]<=time)
d[i] <- sum(time==time[i] & cens==1)
St[i] <- St[i-1] * ((n[i]-d[i])/n[i])
}
}# end of for loop
fit <- data.frame(ti=time, ni=n, di=d, St )
【问题讨论】:
-
一方面预先分配 n、d 和 St、
n <- numeric(l)等等。这样,您不会在每个循环中复制这些向量以填充添加下一个条目,内存已经分配。 -
@lmo 我相信 JIT 字节码编译器现在主要处理这个问题。
-
@Roland 真的吗?这太棒了。是否知道任何描述此行为的文档?
-
@lmo 我不确定我是否在某个地方读到过这篇文章(可能是新闻),但我认为this talk 中提到了它,当我最近进行基准测试时,增长并不比预分配慢。跨度>
-
@Roland 感谢您的链接。有机会会去看看。
标签: r