当前位置:  开发笔记 > 编程语言 > 正文

提高模拟qbeta值的sapply函数的性能

如何解决《提高模拟qbeta值的sapply函数的性能》经验,为你挑选了1个好方法。



1> nicola..:

您可以在不使用sapply因为qbeta矢量化的情况下获得结果.我们重复网格值nrow(df)次数.最后,您将获得一个matrix行,其行是qbeta相应行的值data.注意:考虑到大量的时间,这可能会很慢.除非你并行化或使用更强大的PC,否则不要认为你可以从这里大大加快速度.试一试:

res<-matrix(qbeta(rep(seq(0.0025, 0.9975, by=0.005),
            each=nrow(data)),data$a, data$b),
            nrow=nrow(data))

编辑

在这里,我将做一个简单的并行示例.我们使用 doParallel包.我们将datadata.frame 拆分为一个块列表,然后我们为每个块调用上面的行.从头开始:

#create the data (just 10000 rows)
set.seed(1)    
data<-as.data.frame(matrix(runif(10000,0,1),10000,2,dimnames=list(NULL,letters[1:2])))
#split in 10 1000 rows chunks
dataSplit<-split(data,(seq_len(nrow(data))-1)%/%1000)
#define the function to make the qbeta calculation
qbetaVec<-function(grid,values)
           matrix(qbeta(rep(grid,each=nrow(values)),values$a,values$b),nrow=nrow(values))
#define the grid
grid<-seq(0.0025, 0.9975, by=0.005)
#full calculation
system.time(res<-qbetaVec(grid,data))   
# user  system elapsed 
#5.103   0.007   5.115
#now we parallelize
library(doParallel)
#set the number of clusters
cl <- makeCluster(8)
registerDoParallel(cl)
#now the calculation with foreach and dopar
system.time(res2<-foreach(i=1:10) %dopar% qbetaVec(grid,dataSplit[[i]]))
#  user  system elapsed 
# 0.026   0.019   1.404
#now we put all together
res3<-do.call(rbind,res2)
identical(res3,res)
#[1] TRUE

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有