मैं यह कहकर इस जवाब का प्रस्ताव देने जा रहा हूं कि इस पैमाने पर समय सटीक रूप से मापने के लिए कठिन हो सकता है (शायद timeit
का उपयोग करने के लिए सबसे अच्छा) और यह कि अनुकूलन के इस प्रकार लगभग आपके वास्तविक में कोई फर्क नहीं पड़ेगा कार्यक्रम के क्रम ...
ठीक है, अब त्याग किया जाता है ...
पहली बात यह है कि आप सूचना के लिए की जरूरत है कि आप केवल जनरेटर/xrange वस्तु के निर्माण के समय कर रहे हैं - आप कर रहे हैं समय पर वास्तव में पुनरावृत्त करने में कितना समय लगता है । जानने के कुछ कारण हैं जिनकी वजह जनरेटर बनाने के लिए तेजी से xrange वस्तु बनाने की तुलना में कुछ मामलों में हो सकता है ...
- जनरेटर मामले के लिए कर रहे हैं, आप केवल एक जनरेटर बना रहे हैं - जनरेटर में कोई कोड वास्तव में हो जाता है चलाते हैं। यह लगभग 1 फ़ंक्शन कॉल की मात्रा है।
xrange
मामले के लिए, आप समारोह और तो आप है वैश्विक नाम xrange
देखने के लिए वैश्विक TOTAL
कॉल कर रहे हैं, और फिर आप कि builtin कॉल करने के लिए की जरूरत है - तो वहाँ अधिक चीजों में निष्पादित किया जा रहा हैं ये मामला।
स्मृति के लिए के रूप में - आलसी तरीकों में से दोनों में, प्रयुक्त स्मृति अजगर क्रम का बोलबाला हो जाएगा - नहीं अपने जनरेटर वस्तुओं के आकार के आधार पर। एकमात्र ऐसा मामला जहां आपकी स्क्रिप्ट द्वारा मेमोरी उपयोग की सराहना की जाती है वह मामला है जहां आप 100 मिलियन वस्तुओं की सूची बनाते हैं।
यह भी ध्यान रखें कि मैं वास्तव में अपने सिस्टम पर लगातार अपने परिणामों की पुष्टि नहीं कर सकते हैं ... timeit
का उपयोग करना, मैं वास्तव में है कि my_xrange
कभी कभी तेजी से (~ 30%) के निर्माण के लिए है मिलता है।
अपनी स्क्रिप्ट के नीचे करने के लिए निम्न जोड़ना:
from timeit import timeit
print timeit('my_xrange()', setup='from __main__ import my_xrange')
print timeit('my_sequence()', setup='from __main__ import my_sequence')
और मेरे परिणाम (पर ओएस एक्स एल Capitan CPython
के लिए) इस प्रकार हैं:
0.227491140366
0.356791973114
हालांकि, pypy
के पक्ष में रहा है जनरेटर निर्माण (मैंने इसे पहले my_xrange
दोनों और my_sequence
दोनों के साथ आजमाया और काफी लगातार परिणाम प्राप्त किए, हालांकि पहले व्यक्ति को चलाने के लिए कुछ नुकसान होता है - शायद जेआईटी गर्म समय के कारण या तो mething):
0.00285911560059
0.00137305259705
यहाँ, मैं xrange
बढ़त हासिल है की उम्मीद करेंगे - लेकिन फिर, कुछ भी सच है जब तक आप timeit
और फिर यह केवल सच है अगर समय मतभेद हैं महत्वपूर्ण और यह केवल कंप्यूटर पर सच है जहां आपने समय किया था।
देखें उद्घाटन अस्वीकरण :-P
'xrange' एक अनुक्रम वस्तु जनरेटर नहीं है, इसलिए उनके आंतरिक बिल्कुल समान नहीं हैं। इसके अलावा, आपके द्वारा दिए गए समय वास्तव में xrange और जनरेटर के बीच काफी अंतर नहीं दिखाते हैं। असल में अंतर नगण्य है – smac89
ठीक करने के लिए एक चीज वास्तव में सूची बनाने के लिए है जब आप 'xrange' का उपयोग करते हैं। 'My_xrange' फ़ंक्शन में, आप केवल xrange _generator_ लौट रहे हैं (यह वास्तव में जनरेटर नहीं है)। लेकिन अभी तक पूरी सूची में संसाधित नहीं किया गया है। तो यह उपरोक्त संख्याओं की तुलना में धीमी गति से भी जा सकता है। – aneroid
आप केवल जनरेटर बनाने और 'xrange' ऑब्जेक्ट बनाने के लिए कितना समय लेते हैं - आप इन ऑब्जेक्ट्स पर वास्तव में पुन: प्रयास करने के लिए कितना समय लेते हैं ... – mgilson