我知道R可以最有效地使用向量,并且应该避免循环.我很难教自己用这种方式编写代码.我想了解如何"矢量化"我的代码.下面是为10,000个非唯一的state(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分钟.知道为什么吗?
显然,在我发布问题之前,我应该再研究一下这个问题.回想起来,这是显而易见的.:)
为了使用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个样本.我知道矢量更快,但是dang.我假设100,000个循环使用一个循环需要花费一个多小时,矢量方法需要<1秒.只是为了踢,我让矢量一百万.完成需要大约2秒钟.因为我必须测试失败,我尝试了10毫米,但在我的2GB笔记本电脑上耗尽了内存.我用6GB内存切换到我的Vista 64桌面,并在17秒内创建了长度为10mm的向量.由于其中一个向量超过763mb而导致分配问题,因此100mm制造的东西分崩离析.
R中的向量对我来说非常快.我猜这就是为什么我是经济学家,而不是计算机科学家.
要回答你的问题,为什么10000的循环花费的时间比你的1000循环长得多:
我认为主要的嫌疑是每个循环都会发生的连接.随着数据变得越来越长,R可能会将向量的每个元素复制到一个更长的新向量中.将一小部分(平均500个元素)数据集复制1000次很快.复制较大的(平均5000个元素)数据集10000次较慢.