2011-12-05 17 views
25

मैंने अभी एक प्रोग्राम बदल दिया है जिसे मैं अपने डेटा को numpy arrays के रूप में रखने के लिए लिख रहा हूं क्योंकि मेरे पास प्रदर्शन समस्याएं थीं, और अंतर अविश्वसनीय था। इसे मूल रूप से चलाने में 30 मिनट लग गए और अब 2.5 सेकंड लगते हैं!NumPy arrays इतनी तेज़ क्यों हैं?

मैं सोच रहा था कि यह कैसे करता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि यह for लूप की आवश्यकता को हटा देता है लेकिन उससे परे मैं स्टंप हो गया हूं।

+4

मुझे लगता है कि यह पाइथन की बजाय सी में लागू किया गया है। –

+7

@NoufalIbrahim: पायथन सूची भी [सी में लागू] हैं (http://stackoverflow.com/questions/3917574/how-is-pythons-list-implemented/3958322#3958322)। –

+7

दो अस्पष्ट कार्यक्रम क्या कर रहे थे और उन्हें कैसे लागू किया गया था, इसके किसी भी संकेत के बिना सुंदर अस्पष्ट प्रश्न। –

उत्तर

52

गूंगा सरणी सजातीय प्रकार के घनी पैक वाले सरणी हैं। इसके विपरीत, पाइथन सूचियां ऑब्जेक्ट्स के पॉइंटर्स के सरणी हैं, भले ही वे सभी एक ही प्रकार के हों। तो, आपको locality of reference का लाभ मिलता है।

इसके अलावा, पाइथन, सूचक संकेतक और प्रति-तत्व गतिशील प्रकार की जांच में लूप की सामान्य लागत से परहेज करते हुए, सी में कई नकली संचालन लागू किए जाते हैं। स्पीड बूस्ट इस बात पर निर्भर करता है कि आप कौन से परिचालन कर रहे हैं, लेकिन परिमाण के कुछ आदेश संख्या क्रंचिंग कार्यक्रमों में असामान्य नहीं हैं।

+1

इन सी-लिखित संचालन के लिए पाइथन फ्रंट-एंड की पेशकश करना कैसे संभव है? इस तकनीक का नाम क्या है? –

+0

यह सच नहीं हो सकता है। पाइथन सूचियां पॉइंटर्स के सरणी नहीं होती हैं जब तत्व आदिम प्रकार होते हैं, जैसे पूर्णांक। परीक्षण करने का एक त्वरित तरीका एक चर को एक चर में सहेजना और उस चर के साथ एक सरणी बनाना है। यदि आप चर बदलते हैं, तो सरणी नहीं बदली जाती है। – Rohan

+0

@ रोहन भी प्राचीन प्रकार के वस्तुएं याद रखें। तो जब आपने सूची में उस चर को जोड़ा, तो आप वास्तव में उस ऑब्जेक्ट को जोड़ रहे हैं जो विशिष्ट चर बिंदुओं को सूची में जोड़ता है। इस मामले में, यह वस्तु एक संख्या है। तो जब आप चर बदलते हैं, या अधिक सटीक रूप से, नाम को एक नए पूर्णांक में दोबारा जोड़ता है, तो आप मूल वस्तु के गुणों को नहीं बदल रहे हैं, यानी मूल संख्या। इसलिए यह अपेक्षा की जाती है कि सरणी में 'संबंधित' संख्या इसके मूल्य को परिवर्तित नहीं करती है। – Kun

1

बेवकूफ सरणी सी 'जैसे' सामान्य 'सरणी के समान ही हैं। ध्यान दें कि प्रत्येक तत्व को एक ही प्रकार का होना चाहिए। स्पीडअप बहुत बढ़िया है क्योंकि आप प्रीफेचिंग का लाभ उठा सकते हैं और आप इसके सूचकांक द्वारा सरणी में किसी तत्व को तत्काल एक्सेस कर सकते हैं।

+0

क्या आप विस्तार कर सकते हैं कि प्रत्येक तत्व के लिए एक ही प्रकार के कंप्यूटिंग तेजी से कैसे बनाते हैं? – Rohan

9

numpy arrays विशिष्ट डेटा संरचनाएं हैं। इसका मतलब है कि आपको न केवल एक कुशल इन-मेमोरी प्रस्तुति के लाभ प्राप्त होते हैं, बल्कि कुशल विशेष कार्यान्वयन भी होते हैं।

उदा। यदि आप दो सरणी को संक्षेप में जोड़ रहे हैं तो अतिरिक्त लूप में int अतिरिक्त के पायथन कार्यान्वयन को कॉल करने के बजाय अतिरिक्त CPU वेक्टर ऑपरेशंस के साथ अतिरिक्त प्रदर्शन किया जाएगा।

+1

ये (विशेष संचालन और गतिशील अनुकूलन) सही उत्तर हैं।मुख्य प्रदर्शन कारकों (दुभाषिया ओवरहेड) को संबोधित किए जाने के बाद पूर्व-fetching और संदर्भ की इलाके जैसे छोटे कारक केवल महत्वपूर्ण हो जाते हैं। – Dave

+2

संदर्भ के इलाके दो कारणों से महत्वपूर्ण है: इलाके की वजह से (और कैशिंग पर इसके प्रभाव), और क्योंकि संकेत की कमी का मतलब है कि संकेतों को संसाधित करने के निर्देशों को छोड़ दिया जा सकता है। –

1

आपके पास अभी भी लूप हैं, लेकिन वे सी में किए जाते हैं। Numpy एटलस पर आधारित है, जो रैखिक बीजगणित संचालन के लिए एक पुस्तकालय है।

http://math-atlas.sourceforge.net/

जब एक बड़ा गणना का सामना करना पड़ है, यह कई कार्यान्वयन का उपयोग कर पता लगाने के लिए जो इस समय हमारे कंप्यूटर पर सबसे तेजी से एक है परीक्षण चलेंगे। कुछ numpy बनाता है comutations एकाधिक cpus पर समानांतर किया जा सकता है। तो आप लगातार मेमोरी ब्लॉक पर चल रहे अत्यधिक अनुकूलित सी होगा।

+5

नम्पी एटलस पर आधारित नहीं है। यदि यह उपलब्ध हो, तो इसका उपयोग कर सकते हैं, इसकी कार्यक्षमता के बहुत छोटे, बहुत छोटे सबसेट (मूल रूप से डॉट, जीएमवी और जीएमएम) के लिए एक बीएलएएस कार्यान्वयन। वह बीएलएएस अंतर्निहित संदर्भ बीएलएएस हो सकता है, जिसमें जहाज, या एटलस, या इंटेल एमकेएल (उत्साह वितरण इस के साथ बनाया गया है) हो सकता है। – talonmies

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