我想并行化一个名为unparallelizedfnc的函数。该函数调用其他四个函数(需要很长时间才能计算)并存储结果。最后结果合并。考虑我的功能的玩具示例(当然这些不是我称之为的四个真实功能,仅用于演示)。
如何在具有多个内核的计算机上并行化result1,result2,result3和result4的计算?我希望它可以在Windows,Linux和Mac OSX上运行。在这种情况下无需对并行化版本进行基准测试(由于开销会慢一些,但在我的实际代码中它会更快)。
如果四个结果是相同的函数(但是数据不同),我可以使用并行for循环(foreach)或并行apply,但在这种情况下函数是不同的。
unparallelizedfnc <- function(x) {
result1 <- sum(x)
result2 <- median(x)
result3 <- min(x)
result4 <- max(x)
result <- mean(c(result1,result2,result3, result4))
result
}
unparallelizedfnc(rnorm(100000))
答案 0 :(得分:6)
我首先根据@Jilber的建议纠正了你的功能:
unparallelizedfnc <- function(x) {
result1 <- sum(x)
result2 <- median(x)
result3 <- min(x)
result4 <- max(x)
result <- mean(c(result1,result2,result3, result4))
result
}
parallelizedfnc <- function(x) {
require(parallel)
funs <- list(sum,median,min,max)
mean(do.call("c",mclapply(funs,function(fun) fun(x),mc.cores = 4)))
}
set.seed(42)
x <- rnorm(1e8)
identical(unparallelizedfnc(x),parallelizedfnc(x))
#[1] TRUE
library(microbenchmark)
microbenchmark(unparallelizedfnc(x),parallelizedfnc(x),times=3)
# Unit: seconds
# expr min lq median uq max neval
# unparallelizedfnc(x) 3.155736 3.166381 3.177027 3.195497 3.213967 3
# parallelizedfnc(x) 5.047008 5.207747 5.368486 5.514221 5.659956 3
请注意sum
等。太快,无法从并行化中受益。由于并行化开销,该功能需要更多时间。我假设您的真实用例具有较少优化的功能。