Fungsi "sampel" pembandingan dalam R

11

Saya membandingkan samplefungsi dalam R dan membandingkannya dengan igraph:sample_seqdan berlari ke hasil yang aneh.

Ketika saya menjalankan sesuatu seperti:

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))

Saya mendapatkan hasil seperti ini:

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

Tetapi ketika saya berlari, misalnya,

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

Saya mendapatkan hasil yang jauh lebih cepat untuk 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

Tampaknya kapan Nkekuatan 10 (atau nomor khusus lainnya?), sampleJauh lebih cepat daripada yang lebih kecil lainnya Nyang bukan kekuatan 10. Apakah ini perilaku yang diharapkan atau apakah saya kehilangan sesuatu?

passerby51
sumber

Jawaban:

10

sample()atau lebih tepatnya sample.int()secara default menggunakan algoritma hash ketika kondisi tertentu terpenuhi, salah satunya adalah bahwa n> 1e7.

Jika tolok ukur kedua dijalankan ulang tanpa hashing Anda akan melihat bahwa itu juga lebih lambat daripada fungsi 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 

Dari dokumentasi untuk useHashargumen:

logis menunjukkan jika versi hash dari algoritma harus digunakan. Hanya dapat digunakan untuk ganti = FALSE, prob = NULL, dan ukuran <= n / 2, dan benar-benar harus digunakan untuk n besar, karena useHash = FALSE akan menggunakan memori yang sebanding dengan n.

H 1
sumber
Menarik! Sepertinya begitu.
Passerby51
Sekarang, saya bertanya-tanya apakah mungkin untuk membandingkan berapa banyak memori yang menggunakan "sample.int" hash dibandingkan dengan igraph :: sample_seq (?)
passerby51