सबसे पहले, आप len()
की गति से मापा नहीं है, तो आप मापा जाता है एक सूची बनाने की गति/एक साथ सेटlen()
की गति के साथ।
$ python -m timeit --setup "a=[1,2,3,4,5,6,7,8,9,10]" "len(a)"
10000000 loops, best of 3: 0.0369 usec per loop
$ python -m timeit --setup "a={1,2,3,4,5,6,7,8,9,10}" "len(a)"
10000000 loops, best of 3: 0.0372 usec per loop
बयान आप --setup
को पारित len()
की गति को मापने से पहले चलाए जा रहे हैं:
timeit
की --setup
तर्क का प्रयोग करें।
दूसरा, आपको ध्यान रखना चाहिए कि len(a)
एक बहुत तेज़ कथन है। इसकी गति को मापने की प्रक्रिया "शोर" के अधीन हो सकती है। विचार करें कि the code executed (and measured) by timeit निम्नलिखित के बराबर है:
for i in itertools.repeat(None, number):
len(a)
क्योंकि len(a)
और itertools.repeat(...).__next__()
दोनों तेजी से संचालन कर रहे हैं और उनकी गति समान हो सकता है, itertools.repeat(...).__next__()
की गति समय को प्रभावित कर सकते।
$ python -m timeit --setup "a=[1,2,3,4,5,6,7,8,9,10]" "$(for i in {0..1000}; do echo "len(a)"; done)"
10000 loops, best of 3: 29.2 usec per loop
$ python -m timeit --setup "a={1,2,3,4,5,6,7,8,9,10}" "$(for i in {0..1000}; do echo "len(a)"; done)"
10000 loops, best of 3: 29.3 usec per loop
(परिणाम:
इस कारण से, आप बेहतर ढंग से माप len(a); len(a); ...; len(a)
(100 बार या तो बार-बार) ताकि पाश के लिए के शरीर इटरेटर से समय की एक काफी अधिक राशि लेता चाहते अभी भी कहना है कि len()
सूचियों और सेट पर ही प्रदर्शन किया है, लेकिन अब आप यह सुनिश्चित करें कि परिणाम सही है कर रहे हैं।)
तीसरे, यह सच है कि "जटिलता" और "गति" से संबंधित हैं, लेकिन मैं आपको लगता है कि कुछ भ्रम कर रहे हैं। तथ्य यह है कि len()
में ओ (1) सूचियों और सेटों के लिए जटिलता का अर्थ यह नहीं है कि इसे सूचियों और सेटों पर एक ही गति के साथ चलाना चाहिए।
इसका मतलब है कि, औसत पर, कोई फर्क नहीं पड़ता कि सूची a
कितनी देर तक है, len(a)
समान एसिम्पटोटिक संख्याओं को निष्पादित करता है। और कोई फर्क नहीं पड़ता कि सेट b
कितना समय है, len(b)
एक ही एसिम्प्टोटिक संख्याओं का पालन करता है। लेकिन सूचियों और सेटों के आकार की गणना करने के लिए एल्गोरिदम भिन्न हो सकता है, जिसके परिणामस्वरूप अलग-अलग प्रदर्शन होते हैं (टाइमिट दिखाता है कि यह मामला नहीं है, हालांकि यह एक संभावना हो सकती है)।
अन्त में,
एक सेट वस्तु के निर्माण के लिए और अधिक समय सूची तैयार की तुलना में लेता है, क्या अन्तर्निहित कारण हो सकता है?
एक सेट, जैसा कि आप जानते हैं, दोहराए गए तत्वों की अनुमति नहीं देता है। सीपीथॉन में सेट हैश टेबल के रूप में लागू किए गए हैं (औसत ओ (1) सम्मिलन और लुकअप सुनिश्चित करने के लिए): एक हैश तालिका का निर्माण और रखरखाव सूची में तत्व जोड़ने से कहीं अधिक जटिल है।
विशेष रूप से, सेट सेट करते समय, आपको हैश की गणना करना है, हैश टेबल बनाना है, डुप्लिकेट किए गए ईवेंट डालने से बचने के लिए इसे देखें। इसके विपरीत, सीपीथॉन में सूचियों को पॉइंटर्स की एक साधारण सरणी के रूप में कार्यान्वित किया जाता है जो malloc()
एड और realloc()
एड आवश्यकतानुसार है।-s
ध्वज के साथ
आपकी आखिरी वाक्य काफी संभव है - सेट में आइटम जोड़ते समय हैशिंग शामिल है। –
आप पता लगाने के लिए 'len()' के बिना ब्लॉक का समय निकालने का प्रयास कर सकते हैं :) – Caramiriel
@ करमीरियल या दो तारों से अलग और '-s' विकल्प पास करें :) – Maroun