जवाबों:
यह ओ (1) (निरंतर समय, तत्व की वास्तविक लंबाई के आधार पर नहीं है - बहुत तेज) आपके द्वारा उल्लिखित प्रत्येक प्रकार पर, साथ ही साथ set
अन्य जैसे array.array
।
उन डेटा प्रकारों पर लेन () को कॉल करना , सीपीथॉन में ओ (1) है , जो पायथन भाषा का सबसे आम कार्यान्वयन है। यहां एक तालिका का लिंक दिया गया है जो सीपीथॉन में कई अलग-अलग कार्यों की एल्गोरिथम जटिलता प्रदान करता है:
वे सभी वस्तुएं अपनी लंबाई का हिसाब रखती हैं। लंबाई निकालने का समय छोटा है (O-1 (बड़े-ओ संकेतन में)) और इसमें ज्यादातर [किसी न किसी वर्णन के रूप में लिखा गया है, न कि C शर्तें]: एक शब्दकोश में "लेन" देखें और इसे प्रेषण करें। बिल्ट_इन फ़ंक्शन जो ऑब्जेक्ट की __len__
विधि को देखेगा और कॉल करेगा ... यह सब करना हैreturn self.length
length
शब्दकोश में क्यों नहीं दिखता है dir(list)
?
list.lenght
चर सी में लागू किया गया है, पायथन नहीं।
नीचे दिए गए माप सबूत प्रदान करते हैं जो कि 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
$ 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
$ 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
$ 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
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 एनसेक प्रति लूप
len एक O (1) है क्योंकि आपकी RAM में, सूचियों को तालिकाओं (सन्निहित पतों की श्रृंखला) के रूप में संग्रहीत किया जाता है । यह जानने के लिए कि कब टेबल रूकती है कंप्यूटर को दो चीजों की आवश्यकता होती है: लंबाई और प्रारंभ बिंदु। यही कारण है कि लेन () एक ओ (1) है, कंप्यूटर मूल्य को संग्रहीत करता है, इसलिए इसे बस देखने की जरूरत है।
मैं पायथन में लेन () के बारे में सोच रहा हूं जो सूची के आकार पर निर्भर करता है, इसलिए मैं हमेशा एक चर में लंबाई को संग्रहीत करता हूं यदि मैं कई बार उपयोग करता हूं। लेकिन आज डिबगिंग करते समय, मैंने सूची ऑब्जेक्ट में __len__ विशेषता पर ध्यान दिया, इसलिए लेन () को बस इसे लाना चाहिए, जो जटिलता ओ (1) बनाता है। इसलिए मैंने अभी गुगली की अगर किसी ने पहले ही पूछ लिया और इस पद पर आ गया।
__len__
एक मजेदार बात है, वह चर नहीं जो किसी सूची का प्रतिनिधित्व करता है।
list.__len__
कार्य निरंतर समय में चलता है? यह करता है, लेकिन सिर्फ इसलिए कि यह एक समारोह है। क्योंकि यह उसी के रूप में लागू हुआ।