26

我知道 R 使用向量最有效,应该避免循环。我很难自学以这种方式实际编写代码。我想要一些关于如何“矢量化”我的代码的想法。st下面是为 state ( )、plan1 ( p1) 和 plan2 ( )的 10,000 个非唯一组合创建 10 年样本数据的示例p2

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 个值。如何使用矢量函数更快地做到这一点?

附带说明一下,如果我将上面的代码限制为 i 上的 1000 个循环,它只需要 2 秒,但 10,000 个需要 8 分钟。知道为什么吗?

4

2 回答 2

9

显然,在我发布我的问题之前,我应该再为此工作一个小时。回想起来是如此明显。:)

为了使用 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 秒。由于我必须测试失败,我尝试了 10mm,但我的 2GB 笔记本电脑内存不足。我切换到具有 6GB 内存的 Vista 64 桌面,并在 17 秒内创建了长度为 10mm 的向量。100mm 使事情分崩离析,因为其中一个向量超过 763mb,这导致了 R 的分配问题。

R 中的向量对我来说速度非常快。我想这就是为什么我是经济学家而不是计算机科学家的原因。

于 2009-01-13T18:00:54.133 回答
6

要回答您关于为什么 10000 循环比您的 1000 循环花费更长的时间的问题:

我认为主要的嫌疑人是每个循环都发生的串联。随着数据变长,R 可能会将向量的每个元素复制到一个更长的新向量中。复制一个小的(平均 500 个元素)数据集 1000 次很快。将较大的(平均 5000 个元素)数据集复制 10000 次会更慢。

于 2009-01-13T22:09:25.190 回答