【问题标题】:R optimize script with a lot of loopsR优化脚本有很多循环
【发布时间】:2012-11-30 14:06:33
【问题描述】:

我有一个包含数百列和行的列表。我正在做的是循环遍历几乎所有可能的迭代,以获取两列之间的差异。例如,取第 1 列和第 2 列、第 1 列和第 3 列之间的差异……第 1 列和第 500 列……第 499 列和第 500 列。一旦有了这些差异,我就会计算一些描述性统计数据(即均值、标准偏差、峰度、偏度等)以用于输出。我知道我可以使用 lapply 单独计算每一列的统计数据,但是 sd(x)-sd(y) sd(x-y) 所以它并没有真正减少我的循环。我可以使用 avg(x)-avg(y)=avg(x-y) 但这是我可以使用此属性的唯一统计数据。

这是我的一些伪代码:

    for (n1 in 1:(number of columns) {
        for (n2 in n1:(number of columns) {
            temp<-bigdata[n1]-bigdata[n2]
                 results[abc]<-(maxdrawdown,mean,skewness,kurtosis,count,st dev,
                       median, downsidedeviation)
         }
         }

这样做可能需要几天时间,所以我正在寻找一些改进。我已经将 CompilerenableJIT(3) 一起使用,这确实使它明显更快。我还有其他一些想法,任何煽动都会有所帮助。一个是尝试利用降雪包(仍然试图让我了解如何实现它),并认为一个核心可以计算偏斜和峰度,而另一个核心可以计算其他统计数据。另一个想法是创建大块 temp(即 1-2、1-3、1-4)作为另一个 data.frame(或列表),以便对它使用 lapply 来一次淘汰许多迭代。这会有很大的不同吗?还有什么我想都不敢想的事情吗?

【问题讨论】:

  • *apply 函数应该(快得多),虽然我手头没有数据,而且它们很容易使用
  • @ChrisW:我想你会发现 *apply 并不比循环快。它们当然更紧凑和更具表现力,但基准测试它们通常具有相同的性能。内部功能通常是瓶颈。
  • 你需要提供一个可重现的例子,特别是因为你用来描述你的问题的词非常混乱。列表没有行/列,它们只有元素。我的猜测是bigdata 是一个data.frame,在这种情况下将bigdata 转换为矩阵会明显更快。
  • @DWin,嗯,你可能是对的,尽管quora.com/R-software/… 的答案似乎另有说明。我想这取决于很多因素
  • @ChrisW:第一个示例的最大问题是applyX 转换为矩阵,因此他们实际上是在将矩阵子集(很快)与 data.frame 子集(这很慢)......但将速度差异归因于循环。

标签: r


【解决方案1】:

一个可重现的示例确实会有所帮助,因为您描述问题的方式令人困惑(例如,列表没有行/列)。我的猜测是 bigdataresults 是 data.frames,在这种情况下,将它们中的每一个转换为矩阵将使你的循环明显更快。

【讨论】:

  • 您对 bigdataresults 的假设是正确的,将它们转换为矩阵使它们快了大约 6 倍。
【解决方案2】:

我不知道它是否会更快,但以下内容可能会使代码更易于阅读(如果不是更快的话),尽管它也应该会变得更快一些,因为您已经消除了 for() ...

尝试使用expand.grid(),我倾向于使用的频率低于我应该使用的频率

例如:

nC <- 3 # Num of cols
nR <- 4 # Num of cols
indices <- expand.grid(nC, nC)
# Now you can use apply cleanly
apply(indices, 1,
   function(x) {
      c1 <- x[1]; c2 <- x[2]
      yourResult[c1,c2] <- doYourThing(bigData[,c1], bigData[,c2])
   }
)

嗯,你明白了。 :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 2012-07-02
    • 2021-07-28
    • 2017-09-20
    相关资源
    最近更新 更多