【发布时间】:2018-05-30 15:19:49
【问题描述】:
考虑这个简单的基准
list1 <- as.list(rep(1, 50))
list2 <- as.list(rep(1, 50))
microbenchmark::microbenchmark(
+ map2(list1, list2, sum))
Unit: microseconds
expr min lq mean median uq max neval
map2(list1, list2, sum) 375.31 384.2045 481.8708 407.8115 420.641 7923.58 100
microbenchmark::microbenchmark(
+ mapply(sum, X=list1, Y=list2, SIMPLIFY = FALSE))
Unit: microseconds
expr min lq mean median uq max neval
mapply(sum, X = list1, Y = list2, SIMPLIFY = FALSE) 46.187 50.634 57.45634 53.3715 59.8715 127.27 100
为什么purrr:map2 比mapply 慢几乎8 倍?我的意思是,我只是将两个列表中的数字并排相加。
问题是我在当前代码中使用map2,所以我想了解这里的开销是什么(以及如何解决它)
谢谢!
【问题讨论】:
-
调用每个函数的开销可能会有很大差异,而不是数据计算本身。如果你在更大的数据集上运行它,速度比会小得多。例如,如果我使用以下数据
list1 <- as.list(rnorm(1e6)); list2 <- as.list(rnorm(1e6))运行您的代码,则中位数为 map:1.34 秒,mapply:1.06 秒。map还是比较慢,但是相对差别要小很多。 -
有趣的是,使用上面的百万值列表和函数
function(X,Y) X+Y,map 比 mapply 快一点:1.02 秒对 1.25 秒,当列表有只有 100 个值(148 微秒对 143 微秒)。