2009-07-10 8 views
11

मैं कंप्यूटर की वास्तुकला के बारे में निम्नलिखित प्रश्न के बारे में सोचा। मैं अजगरप्रदर्शन। सम्मिलित (...)

from bisect import bisect 
index = bisect(x, a)  # O(log n) (also, shouldn't it be a standard list function?) 
x.insert(index, a)  # O(1) + memcpy() 

जो log n लेता है, के साथ साथ, अगर मैं सही ढंग से समझते हैं, x[index:] के लिए एक स्मृति प्रतिलिपि आपरेशन में क्या मान लीजिए। अब मैं हाल ही में पढ़ा है कि टोंटी प्रोसेसर और स्मृति तो स्मृति प्रतिलिपि काफी तेजी से रैम के द्वारा किया जा सकता है के बीच संचार में आम तौर पर है। क्या यह काम करता है?

उत्तर

13

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

मेरे शर्त यह होगी कि एक सूची में वस्तुओं के लिए संदर्भ सन्निहित स्मृति में जमा हो जाती है (निश्चित रूप से नहीं एक लिंक की गई सूची के रूप में ...)। यदि वास्तव में ऐसा है, तो x.insert का उपयोग करके प्रविष्टि डाले गए तत्व के पीछे सभी तत्वों को स्थानांतरित कर देगा। यह हार्डवेयर द्वारा कुशलता से किया जा सकता है, लेकिन जटिलता अभी भी ओ (एन) होगी।

छोटे सूचियों के लिए bisect आपरेशन x.insert की तुलना में अधिक समय लग सकता है, भले ही पूर्व हे (लॉग एन) है, जबकि दूसरा हे (एन) है। लंबी सूची के लिए, हालांकि, मुझे लगता है कि x.insert बाधा है। ऐसे मामलों में आपको एक अलग डेटा संरचना का उपयोग करने पर विचार करना चाहिए।

+0

ठीक है, मुझे लगता है कि memcpy यह नहीं कह रहा हूँ() हे है (1) - मुझे पता है यह हे (एन) है, लेकिन लगातार छोटा हो सकता है - और मुझे यकीन है कि अगर यह वास्तव में स्मृति द्वारा अनुकूलित है नहीं कर रहा हूँ। लेकिन अगर यह अनुकूलित करने के लिए अनुकूलित किया गया है, तो कहें कि आप नैतिक रूप से सोचने से 1000 गुना तेज हैं, शायद यह जानने योग्य कुछ है। –

+0

कुछ मामलों में, वहाँ नहीं किसी भी स्थान की सूची में छोड़ दिया है, हो सकता है तो पूरी सूची के बाद नए मुक्त स्मृति केवल एक memmove/memcpy के बजाय आवंटित किया जाता है कॉपी किया गया है। –

+0

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

6

सीपीथन सूची सूक्ष्म सरणी हैं। ओ (लॉग एन) बिसेक्ट और ओ (एन) डालने में से कौन सा प्रदर्शन आपकी प्रदर्शन प्रोफ़ाइल पर हावी है आपकी सूची के आकार और ओ() के अंदर निरंतर कारकों पर निर्भर करता है। विशेष रूप से, बिसेक्ट द्वारा आवंटित तुलना फ़ंक्शन सूची में ऑब्जेक्ट्स के प्रकार के आधार पर कुछ महंगा हो सकता है।

आप संभावित बड़े परिवर्तनशील क्रमबद्ध दृश्यों धारण करने के लिए की जरूरत है तो रैखिक सरणी अंतर्निहित अजगर सूची प्रकार एक अच्छा विकल्प नहीं है। आपकी आवश्यकताओं के आधार पर ढेर, पेड़ या स्किप-सूचियां उपयुक्त हो सकती हैं।

9

उपयोग blist module अगर आप बेहतर डालने के प्रदर्शन के साथ एक सूची की जरूरत है।

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