Rの「サンプル」関数のベンチマーク


11

私はsampleRで関数をベンチマークし、それを比較igraph:sample_seqして、奇妙な結果に出会いました。

私が次のようなものを実行すると:

library(microbenchmark)
library(igraph)
set.seed(1234)
N <- 55^4
M <- 500
(mbm <- microbenchmark(v1 = {sample(N,M)}, 
                       v2 = {igraph::sample_seq(1,N,M)}, times=50))

私はこのような結果を得ます:

Unit: microseconds
 expr       min        lq        mean     median        uq       max neval
   v1 21551.475 22655.996 26966.22166 23748.2555 28340.974 47566.237    50
   v2    32.873    37.952    82.85238    81.7675    96.141   358.277    50

でも走ると例えば

set.seed(1234)
N <- 100^4
M <- 500
(mbm <- microbenchmark(v1 = {sample(N,M)}, 
                      v2 = {igraph::sample_seq(1,N,M)}, times=50))

の結果がはるかに速くなりsampleます:

Unit: microseconds
 expr    min     lq     mean  median     uq     max neval
   v1 52.165 55.636 64.70412 58.2395 78.636  88.120    50
   v2 39.174 43.504 62.09600 53.5715 73.253 176.419    50

ときと思われるN10のパワー(またはいくつかの他の特別な番号は?)で、sample小さいはるかに高速以外であるN10の累乗でないことは、この期待される動作ですか私は何かが足りないのですか?

回答:


10

sample()むしろsample.int()、特定の条件が満たされた場合、デフォルトではハッシュアルゴリズムを使用します。1つはn> 1e7です。

2番目のベンチマークをハッシュせずに再実行すると、igraph関数よりもはるかに遅いことがわかります。

set.seed(1234)
N2 <- 100^4
M <- 500
(mbm <- microbenchmark(v1 = {sample.int(N2,M, useHash = FALSE)}, 
                       v2 = {igraph::sample_seq(1,N2,M)}, times=50))

Unit: microseconds
 expr        min         lq         mean     median         uq       max neval cld
   v1 144297.936 150368.649 167224.95664 154283.077 157832.520 407710.78    50   b
   v2     61.218     65.392     92.35544     87.885    118.262    148.87    50  a 

useHash引数のドキュメントから:

アルゴリズムのハッシュバージョンを使用する必要があるかどうかを示す論理。useHash = FALSEはnに比例したメモリを使用するため、replace = FALSE、prob = NULL、およびサイズ<= n / 2にのみ使用でき、実際には大きなnに使用する必要があります。


面白い!それのようです。
passerby51

(?)どのくらいのメモリIGRAPH :: sample_seq対ハッシュ化された「sample.int」の使用を比較することが可能であるならば今、私は疑問に思う
passerby51
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.