我正在对 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 的幂(或其他特殊数字?),sample
比其他更小的速度快得多N
不是 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
的文档争论:logical indicating if the hash-version of the algorithm should be used. Can only be used for replace = FALSE, prob = NULL, and size <= n/2, and really should be used for large n, as useHash=FALSE will use memory proportional to n.
关于r - R 中的基准测试 "sample"函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60518739/