簡體   English   中英

如何使用Rcpp加速此R函數?

[英]how to speed up this R function with Rcpp?

我想用R循環寫出很多文本文件,但是我不知道如何用Rcpp加快速度? 測試數據和R功能如下:

mywrite<- function(data,dataid){
  for(i in unique(dataid$id)) {
    yearid=data[["year"]][i==data[["id"]]]
    for(yr in yearid) {
      fname=paste(i,sprintf("%03d",yr%%1000),sep=".")
      write.table(dataid[i,],file=fname,row.names=FALSE,col.names=FALSE)
      write.table(subset(data,year==yr&id==i),file=fname,row.names=FALSE,col.names=FALSE,append=TRUE)
    }
  }
}

data=data.frame(id=rep(1:5,4),year=rep(1991:2000,2),x=rep(1,40),y=rep(1,40))
dataid=data.frame(id=1:5,lat=31:35,lon=101:105)
mywrite(data,dataid)

PS:使用R大約需要50分鍾來寫出30000個文本文件,而使用FORTRAN則只需要10分鍾。

通過消除循環中的所有冗余subset ,並使用拆分應用策略,我得到了4倍的加速:

mywrite2<- function(data,dataid){
  by(data, interaction(data$year, data$id), function(x){
             i <- x$id[1]
             yr <- x$year[1]
             fname=paste(i,sprintf("%03d.2",yr%%1000),sep=".")
             write.table(dataid[i,],file=fname,row.names=FALSE,col.names=FALSE)
             write.table(x, file=fname, row.names=FALSE, col.names=FALSE, append=TRUE) 
          })
}


> require(microbenchmark)
> microbenchmark(
+ mywrite(data,dataid)
+ ,
+ mywrite2(data,dataid)
+ )
Unit: milliseconds
                   expr       min         lq        mean     median         uq        max neval
  mywrite(data, dataid) 76.613679 77.4709100 78.86304895 78.0260815 78.7791595 128.463443   100
 mywrite2(data, dataid) 18.894828 19.1707455 20.12820819 19.4053135 21.2940880  23.101325   100

這可能會在您的fortran代碼中得到幫助,而無需Rcpp。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM