我和@musically_ut有同样的印象。 for循环和传统循环for-vs.apply
辩论在这里不太可能对你有帮助。如果您有多个核心,请尝试并行化。有几个包,例如parallel
or snowfall
。哪个包最终是最好和最快的取决于您的机器和操作系统。
在这里,最好并不总是等于最快。跨平台运行的代码比一点额外的性能更有价值。此外,透明度和易用性比最大速度更重要。话虽这么说,我非常喜欢标准解决方案,并建议使用parallel
它随 R 一起提供,可在 Windows、OSX 和 Linux 上运行。
编辑:这是使用OP示例的完全可重现的示例。
library(GWmodel)
data("DubVoter")
library(parallel)
bwlist <- list(bw1 = 20, bw2 = 21)
cl <- makeCluster(detectCores())
# load 'GWmodel' for each node
clusterEvalQ(cl, library(GWmodel))
# export data to each node
clusterExport(cl, varlist = c("bwlist","Dub.voter"))
out <- parLapply(cl, bwlist, function(e){
try(gwr.basic(GenEl2004 ~ DiffAdd + LARent + SC1 +
Unempl + LowEduc + Age18_24 + Age25_44 +
Age45_64, data = Dub.voter,
bw = e, kernel = "bisquare",
adaptive = TRUE, F123.test = TRUE ))
} )
LArent_l <- lapply(lapply(out,"[[","SDF"),"[[","LARent")
unlist(lapply(LArent_l,"mean"))
# finally, stop the cluster
stopCluster(cl)