लेन की लागत () फ़ंक्शन


जवाबों:


341

यह ओ (1) (निरंतर समय, तत्व की वास्तविक लंबाई के आधार पर नहीं है - बहुत तेज) आपके द्वारा उल्लिखित प्रत्येक प्रकार पर, साथ ही साथ setअन्य जैसे array.array


17
उपयोगी उत्तर के लिए धन्यवाद! क्या कोई ऐसा मूल प्रकार है जिसके लिए यह मामला नहीं है?
मावनवीन

141

उन डेटा प्रकारों पर लेन () को कॉल करना , सीपीथॉन में ओ (1) है , जो पायथन भाषा का सबसे आम कार्यान्वयन है। यहां एक तालिका का लिंक दिया गया है जो सीपीथॉन में कई अलग-अलग कार्यों की एल्गोरिथम जटिलता प्रदान करता है:

TimeComplexity Python Wiki पृष्ठ


84

वे सभी वस्तुएं अपनी लंबाई का हिसाब रखती हैं। लंबाई निकालने का समय छोटा है (O-1 (बड़े-ओ संकेतन में)) और इसमें ज्यादातर [किसी न किसी वर्णन के रूप में लिखा गया है, न कि C शर्तें]: एक शब्दकोश में "लेन" देखें और इसे प्रेषण करें। बिल्ट_इन फ़ंक्शन जो ऑब्जेक्ट की __len__विधि को देखेगा और कॉल करेगा ... यह सब करना हैreturn self.length


3
मुझे लगता है कि यह सबसे उपयुक्त उत्तर है क्योंकि यह कार्यान्वयन विवरण में अंतर्दृष्टि देता है।
एके

lengthशब्दकोश में क्यों नहीं दिखता है dir(list)?
वीआईएफआई

यह वही है जो मैं देख रहा था
विशाख विजयन

@ViFI क्योंकि यह सिर्फ एक उदाहरण है। सचित्र list.lenghtचर सी में लागू किया गया है, पायथन नहीं।
कोवलस्की

73

नीचे दिए गए माप सबूत प्रदान करते हैं जो कि len()टो-यूज़ किए गए डेटा संरचनाओं के लिए O (1) है।

के बारे में एक नोट timeit: जब -sध्वज का उपयोग किया जाता है और timeitपहले तार को दो तार पास किए जाते हैं, केवल एक बार निष्पादित किया जाता है और समयबद्ध नहीं होता है।

सूची:

$ python -m timeit -s "l = range(10);" "len(l)"
10000000 loops, best of 3: 0.0677 usec per loop

$ python -m timeit -s "l = range(1000000);" "len(l)"
10000000 loops, best of 3: 0.0688 usec per loop

टपल:

$ python -m timeit -s "t = (1,)*10;" "len(t)"
10000000 loops, best of 3: 0.0712 usec per loop

$ python -m timeit -s "t = (1,)*1000000;" "len(t)"
10000000 loops, best of 3: 0.0699 usec per loop

स्ट्रिंग:

$ python -m timeit -s "s = '1'*10;" "len(s)"
10000000 loops, best of 3: 0.0713 usec per loop

$ python -m timeit -s "s = '1'*1000000;" "len(s)"
10000000 loops, best of 3: 0.0686 usec per loop

शब्दकोश (2.7+ में उपलब्ध शब्दकोश-समझ):

$ python -mtimeit -s"d = {i:j for i,j in enumerate(range(10))};" "len(d)"
10000000 loops, best of 3: 0.0711 usec per loop

$ python -mtimeit -s"d = {i:j for i,j in enumerate(range(1000000))};" "len(d)"
10000000 loops, best of 3: 0.0727 usec per loop

सरणी:

$ python -mtimeit -s"import array;a=array.array('i',range(10));" "len(a)"
10000000 loops, best of 3: 0.0682 usec per loop

$ python -mtimeit -s"import array;a=array.array('i',range(1000000));" "len(a)"
10000000 loops, best of 3: 0.0753 usec per loop

सेट करें (2.7+ में उपलब्ध समझ)

$ python -mtimeit -s"s = {i for i in range(10)};" "len(s)"
10000000 loops, best of 3: 0.0754 usec per loop

$ python -mtimeit -s"s = {i for i in range(1000000)};" "len(s)"
10000000 loops, best of 3: 0.0713 usec per loop

Deque:

$ python -mtimeit -s"from collections import deque;d=deque(range(10));" "len(d)"
100000000 loops, best of 3: 0.0163 usec per loop

$ python -mtimeit -s"from collections import deque;d=deque(range(1000000));" "len(d)"
100000000 loops, best of 3: 0.0163 usec per loop

1
यह बेंचमार्क का इतना अच्छा नहीं है, हालांकि यह दिखाता है कि हम पहले से ही क्या जानते हैं। ऐसा इसलिए है क्योंकि रेंज (10) और रेंज (1000000) को ओ (1) नहीं माना जाता है।
अज्ञात

3
यह अब तक का सबसे अच्छा जवाब है। यदि किसी को निरंतर समय का एहसास नहीं होता है तो आपको बस एक निष्कर्ष जोड़ना चाहिए।
संततिगोब्स्सुल्तो

4
टिप्पणी के लिए धन्यवाद। मैंने O (1) की जटिलता के बारे में एक नोट जोड़ा len()और -sझंडे का सही उपयोग करने के लिए माप भी तय किया ।
यांत्रिक_मीट

यह ध्यान रखना महत्वपूर्ण है कि एक चर में लंबाई को बचाने से कम्प्यूटेशनल समय की एक महत्वपूर्ण राशि को बचाया जा सकता है: python -m timeit -s "l = range(10000);" "len(l); len(l); len(l)"223 एनसेक प्रति लूप python -m timeit -s "l = range(100);" "len(l)"66.2 एनसेक प्रति लूप
रेडोस्टिन स्टॉयनोव

16

len एक O (1) है क्योंकि आपकी RAM में, सूचियों को तालिकाओं (सन्निहित पतों की श्रृंखला) के रूप में संग्रहीत किया जाता है । यह जानने के लिए कि कब टेबल रूकती है कंप्यूटर को दो चीजों की आवश्यकता होती है: लंबाई और प्रारंभ बिंदु। यही कारण है कि लेन () एक ओ (1) है, कंप्यूटर मूल्य को संग्रहीत करता है, इसलिए इसे बस देखने की जरूरत है।


3

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


लेकिन __len__एक मजेदार बात है, वह चर नहीं जो किसी सूची का प्रतिनिधित्व करता है।
कोवलस्की

@Kowalski हाँ लेन एक कार्य है, लेकिन यह सब है, यह स्व। लौटाता है
आयुष

लेकिन आपकी पोस्ट उस बारे में कुछ नहीं कहती है। यह भी आप कैसे जानते हैं कि list.__len__कार्य निरंतर समय में चलता है? यह करता है, लेकिन सिर्फ इसलिए कि यह एक समारोह है। क्योंकि यह उसी के रूप में लागू हुआ।
कोवलस्की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.