【发布时间】:2016-01-11 15:24:29
【问题描述】:
我使用这个 sapply 函数:
set.seed(1)
data<-matrix(runif(1000000,0,1),1000000,2)
sapply(seq(0.0025, 0.9975, by=0.005), function (x) qbeta(x, data$a, data$b))
这可能需要很长时间,因为数据可能有 1 百万行。 a 和 b 是唯一的随机值。
如何提高性能?是从每一行查找参数需要时间,还是不可避免?我也尝试过并行版本,它缩短了时间,但速度仍然很慢。
一些结果(我在 38k 行上做了这个):
> system.time(matrix(qbeta(rep(seq(0.0025, 0.9975, by=0.005),each=nrow(data)),data$a, data$b),nrow=nrow(data)))
user system elapsed
34.53 0.00 34.53
> system.time(sapply(seq(0.0025, 0.9975, by=0.005), function (x) qbeta(x, data$a, data$b)))
user system elapsed
34.22 0.00 34.21
这是我的并行代码:
steps<-seq(0.0025, 0.9975, by=0.005)
qbeta.func <- function(x, data) {
return(qbeta(x, data$a, data$b) * data$value)
}
cl <- makeCluster(rep("localhost",4), type = "SOCK")
t1 <- Sys.time()
data <- parSapply(cl, steps, qbeta.func, data)#
stopCluster(cl)
#data <- data[1:20,1:20]
【问题讨论】:
-
很慢,因为你使用不正确。
qbeta是矢量化的,因此您不需要使用sapply一次评估一个值;例如qbeta(seq(0.0025, 0.9975, by=0.005), .5, 1.5). -
@nrussell 我想,他们希望每一百万行都有 200 个值(对于 p 点的网格)。
-
@Frank 啊,谢谢,这不清楚,因为 OP 没有提供可重现的示例。
-
matrix(qbeta(rep(seq(0.0025, 0.9975, by=0.005),each=nrow(data)),data$a, data$b),nrow=nrow(data)) -
@nicola 请作为答案发布...为了更快的速度(如有必要),可能值得分块并行化。
标签: r performance sapply