मान लीजिए हम गए एक vector
(या उस बात के लिए एक data.frame
) इस प्रकार है:"संख्यात्मक" प्रकार पर सबसेट करने से "लॉजिकल" प्रकार धीमा क्यों है?
set.seed(1)
x <- sample(10, 1e6, TRUE)
और एक x
जहां x > 4
के सभी मूल्यों को प्राप्त करना चाहता है, कहते हैं:
a1 <- x[x > 4] # (or)
a2 <- x[which(x > 4)]
identical(a1, a2) # TRUE
मैं सबसे लगता है लोग x[x > 4]
पसंद करेंगे। लेकिन आश्चर्य की बात है (कम से कम मेरे लिए), which
का उपयोग करके सबसेटिंग तेज है!
require(microbenchmark)
microbenchmark(x[x > 4], x[which(x > 4)], times = 100)
Unit: milliseconds
expr min lq median uq max neval
x[x > 4] 56.59467 57.70877 58.54111 59.94623 104.51472 100
x[which(x > 4)] 26.62217 27.64490 28.31413 29.97908 99.68973 100
यह मेरे बारे में 2.1 गुना तेज है। अंतर के लिए
एक संभावना है, मैंने सोचा, तथ्य यह है कि which
NA
पर विचार नहीं करता लेकिन >
उन्हें साथ ही रिटर्न की वजह से हो सकता है। लेकिन फिर तार्किक संचालन स्वयं इस अंतर का कारण होना चाहिए, जो मामले (स्पष्ट रूप से) नहीं है। यही कारण है:
microbenchmark(x > 4, which(x > 4), times = 100)
Unit: milliseconds
expr min lq median uq max neval
x > 4 8.182576 10.06163 12.68847 14.64203 60.83536 100
which(x > 4) 18.579746 19.94923 21.43004 23.75860 64.20152 100
का उपयोग which
1.7 के बारे में गुना धीमी सिर्फ subsetting से पहले है। लेकिन which
सबसेटिंग के दौरान/दौरान भारी पकड़ लेता है।
यह which
कॉल .Internal(which(x))
==
जबकि कॉल .Primitive("==")
के रूप में पसंद debugonce
(thanks to @GavinSimpson) की मेरी हमेशा की तरह हथियार का उपयोग करना संभव नहीं लगता है।
मेरा प्रश्न इसलिए क्यों [
numeric
which
तार्किक वेक्टर >
से उत्पन्न की तुलना में तेजी से उत्पन्न प्रकार पर है? कोई विचार?
धन्यवाद Kohske। मेरा सवाल मूल रूप से * क्यों * यह मामला है। मैंने यह स्पष्ट करने के लिए एक संपादन किया है। – Arun
अपडेट किया गया है लेकिन संभवतः आप सबमिट करने के स्रोत कोड (सी कार्यान्वयन) में बेहतर खुदाई करेंगे यदि आप वास्तव में जानना चाहते हैं कि ओवरहेड कहां है। – kohske
आप इस पोस्ट को थोड़ा सा अपडेट करना चाहते हैं, क्योंकि आपका पहला वाक्य प्रश्न के नए शीर्षक के प्रकाश में उल्लसित रूप से tautological लगता है। – Thomas