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

이 경우 것 같다 N(10)의 전원 (또는 다른 특수 번호는?)입니다, sample작은 훨씬 빠르게 다른보다 N10의 거듭 제곱되지 않은이 예상되는 동작 아니면 내가 뭔가를 놓친 거지?

답변:


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 및 size <= n / 2에만 사용할 수 있으며 useHash = FALSE는 n에 비례하는 메모리를 사용하므로 실제로 큰 n에 사용해야합니다.


흥미 롭습니다! 그런 것 같습니다.
passerby51

이제 해시 된 "sample.int"가 사용하는 메모리와 igraph :: sample_seq (?)의 메모리 양을 비교할 수 있는지 궁금합니다.
passerby51
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.