これは、s3 がメソッドを検索し、次に mean.default で必要な引数の解析が行われるためです。(そして平均的な他のコードも)
sum
とlength
は両方とも原始関数です。高速になります(ただし、NA値をどのように処理していますか?)
t1 <- rnorm(10)
microbenchmark(
mean(t1),
sum(t1)/length(t1),
mean.default(t1),
.Internal(mean(t1)),
times = 10000)
Unit: nanoseconds
expr min lq median uq max neval
mean(t1) 10266 10951 11293 11635 1470714 10000
sum(t1)/length(t1) 684 1027 1369 1711 104367 10000
mean.default(t1) 2053 2396 2738 2739 1167195 10000
.Internal(mean(t1)) 342 343 685 685 86574 10000
の内部ビットは/mean
よりも高速です。sum
length
詳細については、 http: //rwiki.sciviews.org/doku.php?id=packages:cran:data.table#method_dispatch_takes_time ( mirror ) を参照してください (および を回避する data.table ソリューション.Internal
)。
ベクトルの長さを増やすと、プリミティブなアプローチが最速になることに注意してください
t1 <- rnorm(1e7)
microbenchmark(
mean(t1),
sum(t1)/length(t1),
mean.default(t1),
.Internal(mean(t1)),
+ times = 100)
Unit: milliseconds
expr min lq median uq max neval
mean(t1) 25.79873 26.39242 26.56608 26.85523 33.36137 100
sum(t1)/length(t1) 15.02399 15.22948 15.31383 15.43239 19.20824 100
mean.default(t1) 25.69402 26.21466 26.44683 26.84257 33.62896 100
.Internal(mean(t1)) 25.70497 26.16247 26.39396 26.63982 35.21054 100
現在、メソッドのディスパッチは、必要な「時間」全体のほんの一部です。