我知道R使用向量是最有效的,应该避免循环。我很难自学以这种方式实际编写代码。我想要一些关于如何‘向量化’我的代码的想法。下面是为10,000个状态(st)、plan1 (p1)和plan2 (p2)的非唯一组合创建10年样本数据的示例:
st<-NULL
p1<-NULL
p2<-NULL
year<-NULL
i<-0
starttime <- Sys.time()
while (i<10000) {
for (years in seq(1991,2000)) {
st<-c(st,sample(c(12,17,24),1,prob=c(20,30,50)))
p1<-c(p1,sample(c(12,17,24),1,prob=c(20,30,50)))
p2<-c(p2,sample(c(12,17,24),1,prob=c(20,30,50)))
year <-c(year,years)
}
i<-i+1
}
Sys.time() - starttime这大约需要8分钟才能在我的笔记本上运行。不出所料,我最终得到了4个向量,每个向量都有100,000个值。如何使用向量函数更快地完成此操作?
顺便说一句,如果我将上面的代码限制在1000个循环中,只需要2秒,但是10,000个循环需要8分钟。知道为什么吗?
发布于 2009-01-13 18:00:54
显然,在我发布我的问题之前,我应该在这个问题上再工作一个小时。回想起来,这是很明显的。:)
为了使用R的向量逻辑,我去掉了循环,并将其替换为:
st <- sample(c(12,17,24),10000,prob=c(20,30,50),replace=TRUE)
p1 <- sample(c(12,17,24),10000,prob=c(20,30,50),replace=TRUE)
p2 <- sample(c(12,17,24),10000,prob=c(20,30,50),replace=TRUE)
year <- rep(1991:2000,1000)我现在几乎可以瞬间完成100,000个样本。我知道向量更快,但是该死的。我假设100,000个循环使用一个循环会花费一个多小时,而向量法只需要不到1秒。为了好玩,我让向量变成了一百万。它花了大约2秒才完成。由于我必须测试失败,我尝试了10 my,但在我的2 2GB笔记本电脑上耗尽了内存。我切换到我的Vista64桌面,使用6 6GB的内存,在17秒内创建了长度为10 my的向量。100 in使事情分崩离析,因为其中一个向量超过763mb,导致R的分配问题。
R中的向量对我来说是惊人的快。我想这就是为什么我是一个经济学家而不是一个计算机科学家。
发布于 2009-01-13 22:09:25
为了回答你的问题,为什么10000的循环比你的1000循环花了更长的时间:
我认为主要的疑点是在每个循环中发生的连接。随着数据变长,R可能会将向量中的每个元素复制到一个新的向量中。复制一个小的(平均500个元素)数据集1000次是很快的。复制一个更大的(平均5,000个元素)数据集10000次会更慢。
https://stackoverflow.com/questions/439526
复制相似问题