在R中对“样本”功能进行基准测试


11

sample在R中对函数进行了基准测试,并将其与进行比较,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

看来,什么时候N是10的幂(或其他一些特殊数字?),sampleN不是10的幂的其他较小幂更快?

Answers:


10

sample()或者更确切地说sample.int(),在满足某些条件时默认使用哈希算法,其中一个条件是n> 1e7。

如果第二个基准测试没有哈希就重新运行,您会发现它也比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参数的文档中:

逻辑指示是否应使用算法的哈希版本。只能用于replace = FALSE,prob = NULL和大小<= n / 2,并且实际上应该用于大n,因为useHash = FALSE将使用与n成正比的内存。


有趣!好像就是这样。
passerby51

现在,我不知道是否有可能多少内存散列“sample.int”的用途与IGRAPH :: sample_seq比较(?)
passerby51
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.