meanとmean.defaultどちらが速いか問題

以下の結果でどちらが速いかちょっと考えてみてほしい。

> library("microbenchmark")
> microbenchmark(mean(iris$Sepal.Length),
                 mean.default(iris$Sepal.Length))

結果はこちら。mean.defaultの方が速い。

Unit: microseconds
                            expr   min    lq     mean median    uq    max neval cld
         mean(iris$Sepal.Length) 17.60 19.84 22.70733  20.48 21.44 81.280   100   b
 mean.default(iris$Sepal.Length) 12.48 13.76 16.95053  14.40 15.04 89.601   100  a 

これはコードの中身をみるとわかるが、ただsumと書いただけではS3クラスのmethod dispatchが走るからである。
method dispatchがなにかわからない方はAdvanced Rを読むとよい。(邦訳もあるよ!)
http://adv-r.had.co.nz/S3.html

R言語徹底解説

R言語徹底解説


ではmean.defaultを指定した方が速いということで、以下の例ではどうなるかまた考えてみてほしい。

> library("dplyr")
> library("microbenchmark")
> microbenchmark(
         res1 <- iris %>% group_by(Species) %>% summarise(mean(Sepal.Length)),
         res2 <- iris %>% group_by(Species) %>% summarise(mean.default(Sepal.Length)))

結果はこちら。指定しない方が速くなっている。

Unit: milliseconds
                                                                         expr
         res1 <- iris %>% group_by(Species) %>% summarise(mean(Sepal.Length))
 res2 <- iris %>% group_by(Species) %>% summarise(mean.default(Sepal.Length))
      min       lq     mean   median       uq      max neval cld
 1.321609 1.382409 1.435641 1.425929 1.460969 1.837772   100  a 
 1.570250 1.608810 1.715646 1.699051 1.737451 4.227547   100   b

これはdplyrのhybrid evaluationによるもの。
hybrid evaluationの解説はvignetteにまとまっている。
https://cran.r-project.org/web/packages/dplyr/vignettes/hybrid-evaluation.html

ビッグな巨星津駄さんがhybrid evaluationの解説記事書いてくれねえかな

で、私は再三hybrid evaluationについてつぶやいてきたが、市井は「なにそれ食えるの?」みたいな反応であり芳しくない。

だが近年日本のR界にはRcppのビッグな巨星こと津駄さんが登場したわけですよ。
http://teuder.hatenablog.com/
https://www.gitbook.com/book/teuder/introduction-to-rcpp/details/ja
ということでRcppよくわかってない私じゃなくて日本のRomain Francoisこと津駄さんがhybrid evaluationについて解説書いてくれねえかなあと思っている最近。