การเปรียบเทียบฟังก์ชัน "ตัวอย่าง" ใน R


11

ฉันกำลังเปรียบเทียบ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 สิ่งนี้เป็นพฤติกรรมที่คาดหวังหรือฉันขาดอะไรบางอย่าง?

คำตอบ:


10

sample()หรือsample.int()โดยค่าเริ่มต้นจะใช้อัลกอริทึมแฮชเมื่อตรงตามเงื่อนไขบางประการหนึ่งคือนั่น> n

หากมาตรฐานที่สองรันใหม่โดยไม่ต้อง hashing คุณจะเห็นว่ามันช้ากว่าฟังก์ชั่นการเขียนด้วยลายมือมาก

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อาร์กิวเมนต์:

ตรรกะบ่งชี้ว่าควรใช้เวอร์ชันแฮชของอัลกอริทึมหรือไม่ สามารถใช้เพื่อแทนที่ = FALSE, prob = NULL และขนาด <= n / 2 และควรใช้สำหรับ n ขนาดใหญ่จริง ๆ เนื่องจาก useHash = FALSE จะใช้หน่วยความจำตามสัดส่วนกับ n


! ที่น่าสนใจ ดูเหมือนว่าจะเป็นมัน
passerby51

ตอนนี้ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะเปรียบเทียบว่า "sample.int" ที่แฮ็ชใช้หน่วยความจำกับจำนวนมากเท่าไหร่เมื่อเทียบกับ igraph :: sample_seq (?)
passerby51
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.