में दो बड़े लॉजिकल वैक्टरों को पार करने के लिए सबसे तेज़ तरीका दो लॉजिकल वैक्टर, x
और y
, लंबाई> 1E8 के लिए, 2x2 क्रॉस सारणी की गणना करने का सबसे तेज़ तरीका क्या है?आर
मुझे संदेह है कि इसका जवाब सी/सी ++ में लिखना है, लेकिन मुझे आश्चर्य है कि आर में कुछ ऐसा है जो इस समस्या के बारे में पहले से ही काफी स्मार्ट है, क्योंकि यह असामान्य नहीं है।
उदाहरण कोड, 300 एम प्रविष्टियों के लिए (अगर 3E8 बहुत बड़ा है तो एन = 1 ई 8 देने के लिए स्वतंत्र महसूस करें; मैंने कुल आकार केवल 2.5 जीबी (2.4 जीबी) के तहत चुना है। मैंने 0.02 की घनत्व को लक्षित किया है, इसे और अधिक बनाने के लिए दिलचस्प (एक, एक विरल वेक्टर इस्तेमाल कर सकते हैं कि अगर मदद करता है, लेकिन जैसे रूपांतरण समय लग सकता है)
set.seed(0)
N = 3E8
p = 0.02
x = sample(c(TRUE, FALSE), N, prob = c(p, 1-p), replace = TRUE)
y = sample(c(TRUE, FALSE), N, prob = c(p, 1-p), replace = TRUE)
कुछ स्पष्ट तरीके:।
table
bigtabulate
- सरल लॉजिकल ऑपरेशंस (उदा।
sum(x & y)
) - वेक्टर गुणा (बू)
data.table
- ऊपर से कुछ
multicore
पैकेज सेparallel
(या नएparallel
पैकेज के साथ)
मैं पहली बार में एक चाकू लिया है तीन विकल्प (मेरा जवाब देखें), लेकिन मुझे लगता है कि कुछ बेहतर और तेज होना चाहिए।
मुझे लगता है कि table
बहुत धीरे-धीरे काम करता है। bigtabulate
तार्किक वैक्टर की एक जोड़ी के लिए ओवरकिल की तरह लगता है। आखिरकार, वेनिला लॉजिकल ऑपरेशंस करना एक क्लज की तरह दिखता है, और यह प्रत्येक वेक्टर को कई बार (3 एक्स? 7 एक्स?) देखता है, यह उल्लेख नहीं करता कि यह प्रसंस्करण के दौरान बहुत सारी अतिरिक्त मेमोरी भरता है, जो एक भारी समय बर्बाद है।
वेक्टर गुणा आमतौर पर एक बुरा विचार है, लेकिन जब वेक्टर स्पैस होता है, तो उसे इस तरह के भंडारण से बाहर लाभ हो सकता है, और फिर वेक्टर गुणा का उपयोग कर लाभ हो सकता है।
N
और p
भिन्न होने के लिए स्वतंत्र महसूस करें, यदि यह सारणीकरण कार्यों के किसी भी दिलचस्प व्यवहार का प्रदर्शन करेगा। :)
अद्यतन 1. मेरा पहला जवाब तीन अनुभवहीन तरीकों पर समय देता है, जो विश्वास table
धीमी है का आधार है। फिर भी, एहसास करने की मुख्य बात यह है कि "तार्किक" विधि पूरी तरह से अक्षम है। यह क्या कर रहा है को देखो:
- 4 तार्किक वेक्टर संचालन
- 4 प्रकार रूपांतरण (पूर्णांक या तार्किक एफपी -
sum
के लिए) तार्किक ऑपरेशन के लिए - 4 वेक्टर summations
- 8 कार्य (1, सारांश के लिए 1)
न केवल यह, लेकिन यह संकलित या समांतर भी नहीं है। फिर भी, यह अभी भी table
के पैंट को धड़कता है।ध्यान दें कि bigtabulate
, के साथ एक अतिरिक्त प्रकार का रूपांतरण (1 * cbind...
) अभी भी table
धड़कता है।
अद्यतन 2. किसी को भी ऐसा न हो कि का कहना है कि आर समर्थन NA
में तार्किक वैक्टर, और कहा कि कि इन पार tabulations के लिए प्रणाली में एक रिंच (जो ज्यादातर मामलों में सच है) हो जाएगा, मैं कहना चाहिए कि मेरी वैक्टर आ is.na()
या is.finite()
से। :) मैं NA
और अन्य गैर-सीमित मूल्यों को डिबग कर रहा हूं - they've been a headache for me recently। यदि आप नहीं जानते कि क्या है या अपने प्रविष्टियों के सभी नहीं कर रहे हैं NA
, आप any(is.na(yourVector))
साथ परीक्षण कर सकते हैं - यह बुद्धिमान होगा इससे पहले कि आप & ए
अद्यतन 3 इस क्यू में उत्पन्न होने वाली कुछ विचारों की अपनाने। ब्रैंडन बर्टेलसन ने टिप्पणियों में एक बहुत ही उचित सवाल पूछा: एक उप-नमूना (प्रारंभिक सेट, आखिरकार, नमूना है ;-)) क्रॉस-टैबलेशन बनाने के प्रयोजनों के लिए पर्याप्त हो सकता है, तो इतना डेटा क्यों उपयोग करें? आंकड़ों में बहुत दूर नहीं जाना है, लेकिन डेटा उन मामलों से उत्पन्न होता है जहां TRUE
अवलोकन दोनों चर के लिए बहुत दुर्लभ हैं। एक डेटा विसंगति का परिणाम है, दूसरा कोड में संभावित बग के कारण (संभावित बग क्योंकि हम केवल कम्प्यूटेशनल परिणाम देखते हैं - परिवर्तनीय x
को "कचरा इन" और y
के रूप में "कचरा आउट" के रूप में सोचें। परिणामस्वरूप सवाल यह है कि क्या कोड के कारण उत्पादन में समस्याएं पूरी तरह से उन मामलों में हैं जहां डेटा असंगत है, या ऐसे कुछ अन्य उदाहरण हैं जहां अच्छा डेटा खराब हो जाता है? (यही कारण है कि मैंने stopping when a NaN
, NA
, or Inf
is encountered के बारे में एक प्रश्न पूछा।)
भी बताते हैं यही कारण है कि मेरी उदाहरण TRUE
मूल्यों के लिए एक कम संभावना है, इन वास्तव में काफी समय 0.1% से कम होते हैं
इस एक अलग समाधान पथ दर्शाती है हाँ: यह पता चलता है कि हम दो सूचकांकों का उपयोग कर सकते हैं।?(अर्थात। प्रत्येक सेट में TRUE
के स्थान) और गिनती सेट चौराहे। मैंने सेट चौराहे से परहेज किया क्योंकि मुझे थोड़ी देर पहले मैटलैब द्वारा जला दिया गया था (हाँ, यह आर है, लेकिन मेरे साथ भालू), जो पहले एक सेट के तत्वों को छेड़छाड़ करने से पहले सॉर्ट करेगा। ,
मैं हैरान हूँ क्यों 'table' आप के लिए धीमी गति से लगता है: इटरेटर के सम्मान में, यहाँ एक Rcpp इटरेटर समाधान है। जब मैंने इसका इस्तेमाल किया तो यह हमेशा तेज रहा। (माना जाता है कि यह आपके कार्य पर 5 मिनट का समय लगा।) –
@DWin: क्षमा करें मैंने पहले जवाब नहीं दिया था, मैं 'टेबल' पर * प्रतीक्षा * था। :) नीचे मेरे परिणाम देखें। 'टेबल' के नतीजे सिर्फ अबाध हैं। इसे तार्किक वैक्टर की विधि से पीटा गया था, जो स्वयं ही एक बहुत ही बेवकूफ और बहुत अपर्याप्त विधि है - बहुत सारी मेमोरी एक्सेस, फ्लोटिंग प्वाइंट कैलकुलेशन और टाइप रूपांतरण, समांतर नहीं, ... डरावनी। फिर भी, यह अभी भी 'टेबल' से तेज है। – Iterator
हां। मैं भी आश्चर्यचकित था। मेरा तार्किक वेक्टर संस्करण योग (x> y) था, योग (x