在没有Rcpp的情况下提速吗?

时间:2011-11-14 14:08:51

标签: r xts

我希望加快以下算法的速度。我给函数一个xts时间序列,然后想要对前面X点上的每个时间点执行主成分分析(我现在使用的是500),然后使用该PCA的结果(5个主要成分在以下代码)来计算一些值。像这样:

lookback <- 500
for(i in (lookback+1):nrow(x))
{   
        x.now <- x[(i-lookback):i]        
        x.prcomp <- prcomp(x.now)
        ans[i] <- (some R code on x.prcomp)
}

我认为这需要我将回顾行复制为列,以便x类似于cbind(x,lag(x),lag(x,k=2),lag(x,k=3)...lag(x,k=lookback)),然后在每一行上运行prcomp?这看起来很昂贵。也许是apply的一些变体?我愿意看看Rcpp但是想在此之前由你们来管理。

编辑:哇谢谢所有回复。关于我的数据集/算法的信息:

  1. dim(x.xts)目前= 2000x24。但最终,如果这表明有希望,它将必须快速运行(我将给它多个数据集)。
  2. func(x.xts)需要约70秒。这是2000-500 prcomp调用1500个500x24数据帧创建。
  3. 我尝试使用Rprof查看算法中最昂贵的部分,但这是我第一次使用Rprof因此我需要更多使用此工具的经验才能获得可理解的结果(感谢您建议)。

    我想我会先尝试将其转换为_apply类型循环,然后再看看并行化。

1 个答案:

答案 0 :(得分:2)

在我的4核桌面上,如果在合理的时间范围内无法完成,我会使用(未测试)的内容运行块:

library(snowfall)
sfInit(parallel = TRUE, cpus = 4, type = "SOCK")
lookback <- 500
sfExport(list = c("lookback", "x"))
sfLibrary(xts)

output.object <- sfSapply(x = (lookback+1):nrow(x),
    fun = function(i, my.object = x, lb = lookback) {
        x.now <- my.object[(i-lb):i]      
        x.prcomp <- prcomp(x.now)
        ans <- ("some R code on x.prcomp")

        return(ans)
    }, simplify = FALSE) # or maybe it's TRUE? depends on what ans is