Chức năng lấy mẫu điểm chuẩn của mẫu trong R


11

Tôi đã điểm chuẩn samplehàm trong R và so sánh nó với igraph:sample_seqmột kết quả lạ.

Khi tôi chạy một cái gì đó như:

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

Tôi nhận được một kết quả như thế này:

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

Nhưng khi tôi chạy chẳng hạn,

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

Tôi nhận được kết quả nhanh hơn nhiều cho 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

Có vẻ như khi Ncó công suất 10 (hoặc một số đặc biệt nào khác?), sampleNhanh hơn nhiều so với số nhỏ khác Nkhông phải là lũy thừa 10. Đây có phải là hành vi dự kiến ​​hay tôi đang thiếu thứ gì?

Câu trả lời:


10

sample()hay đúng hơn là sample.int()mặc định sử dụng thuật toán băm khi đáp ứng một số điều kiện nhất định, một điều kiện là n> 1e7.

Nếu điểm chuẩn thứ hai được chạy lại mà không băm, bạn sẽ thấy rằng nó cũng chậm hơn nhiều so với chức năng 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 

Từ tài liệu cho useHashđối số:

logic cho biết nếu sử dụng phiên bản băm của thuật toán. Chỉ có thể được sử dụng để thay thế = FALSE, prob = NULL và kích thước <= n / 2 và thực sự nên được sử dụng cho n lớn, vì useHash = FALSE sẽ sử dụng bộ nhớ tỷ lệ với n.


Hấp dẫn! Đó dường như là nó.
người qua đường51

Bây giờ, tôi tự hỏi, nếu nó có thể so sánh bao nhiêu bộ nhớ băm "sample.int" sử dụng so với igraph :: sample_seq (?)
passerby51
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.