2014-07-24 11 views
5

निम्नलिखित पूर्णांक 1 का पहला उदाहरण के स्थान खोजने चाहिए:आर मैच इतना धीमा क्यों है?

array <- rep(1,10000000) 
system.time(match(1,array)) 

यह रिटर्न

user system elapsed 
    0.720 1.243 1.964 

अगर मैं आकार 100 की एक सरणी मैं इस मिल का उपयोग करते हुए एक ही काम के लिए चलाएँ:

user system elapsed 
     0  0  0 

चूंकि यह सब करना चाहिए, सरणी में पहले मान को देखकर और एक मैच लौटने पर, सरणी के आकार के बावजूद लिया गया समय एक लुकअप और तुलना की तुलना में होना चाहिए। यदि मैंने इसे निम्न-स्तरीय भाषा में लिखा है तो सरणी आकार के बावजूद इसे कुछ हद तक घड़ी चक्र (एक माइक्रोसेकंड या कम?) के क्रम में खर्च होंगे। आर में दूसरा क्यों लगता है? ऐसा लगता है कि वह पूरे सरणी के माध्यम से पुनरावृत्त हो रहा है ...

क्या अनावश्यक रूप से निरंतर जारी रखने के बजाए इसके मैच को मिलने के बाद इसे रद्द करने का कोई तरीका है?

+0

यह प्रश्न पढ़ने योग्य हो सकता है: [अधिक कुशल रणनीति जिसके लिए या मिलान करें) (http://stackoverflow.com/questions/16213029/more-efficient-strategy-for-which-or-match/16224331) – thelatemail

उत्तर

9

कारण यह है कि आर वास्तव में रैखिक खोज नहीं कर रहा है, लेकिन यह एक हैश तालिका सेट करता है। यह प्रभावी है यदि आप कई वस्तुओं की खोज कर रहे हैं, लेकिन यदि आप केवल एक नंबर की खोज कर रहे हैं तो बहुत प्रभावी नहीं है।

enter image description here

एक "बेहतर" कार्यान्वयन एक रेखीय खोज इस्तेमाल कर सकते हैं, यदि आप एक श्रेणी में एक ही पूर्णांक के लिए खोज रहे हैं: यहाँ समारोह की रूपरेखा है। मुझे लगता है कि तेजी से होगा।

+0

कूल, इसे साफ़ करने के लिए धन्यवाद :) क्या आप आर में इस "कुशल" विधि का उपयोग करने से दूर हैं? – arman

+0

नहीं, मुझे यकीन नहीं है कि यह कोर आर में लागू किया गया है लेकिन एक रैखिक खोज को कार्यान्वित करना आसान है। आपको इसे सी/सी ++ में करना होगा, क्योंकि आर लूप धीमे होते हैं। यह आरसीपीपी पैकेज का उपयोग करके बहुत आसान है, उदाहरण के लिए आरसीपीपी गैलरी देखें। –

+0

ऊपर से जुड़े प्रश्न से, @mnel सुझाव देता है कि कौन सा। Max (array == 1) 'संभावित समय बचतकर्ता के रूप में – thelatemail

संबंधित मुद्दे