r - R 中的基准测试 "sample"函数

标签 r random

我正在对 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/

相关文章:

R 合并 data.frames asof join

r - 如何使用rpart中的所有功能?

php - 快速生成随机 MySQL 行并多次运行相同的 sql 查询

objective-c - Objective-C 中的非重复随机数

c - 为什么用OpenMP生成随机数没有提速?

c - Linux下socket如何生成随机文件名?

r - 如何使用lapply定义多个变量?

r - 为什么 10 的幂以科学记数法打印为 5 次方?

r - 计算一个单词是否同时匹配两列

c# - 为什么我在这段代码中不断得到两个相同的随机值?