कोड...
options.get(something, doThisMostOfTheTime)()
... ऐसा लगता है कि यह तेज़ होना चाहिए, लेकिन यह वास्तव में धीमी है if
... elif
... else
निर्माण, क्योंकि इसे एक फ़ंक्शन को कॉल करना है, जो एक तंग लूप में एक महत्वपूर्ण प्रदर्शन ओवरहेड हो सकता है।
इन उदाहरणों पर विचार करें ...
1.py
something = 'something'
for i in xrange(1000000):
if something == 'this':
the_thing = 1
elif something == 'that':
the_thing = 2
elif something == 'there':
the_thing = 3
else:
the_thing = 4
2.py
something = 'something'
options = {'this': 1, 'that': 2, 'there': 3}
for i in xrange(1000000):
the_thing = options.get(something, 4)
3.py
something = 'something'
options = {'this': 1, 'that': 2, 'there': 3}
for i in xrange(1000000):
if something in options:
the_thing = options[something]
else:
the_thing = 4
4.py
from collections import defaultdict
something = 'something'
options = defaultdict(lambda: 4, {'this': 1, 'that': 2, 'there': 3})
for i in xrange(1000000):
the_thing = options[something]
... और CPU समय का उपयोग करने पर उनकी मात्रा पर ध्यान दें ...
1.py: 160ms
2.py: 170ms
3.py: 110ms
4.py: 100ms
... उपयोगकर्ता समय का उपयोग करके time(1)
।
विकल्प # 4 में हर अलग-अलग कुंजी मिस के लिए एक नया आइटम जोड़ने का अतिरिक्त मेमोरी ओवरहेड है, इसलिए यदि आप अलग-अलग कुंजी मिस की अनबाउंड संख्या की उम्मीद कर रहे हैं, तो मैं विकल्प # 3 के साथ जाऊंगा, जो अभी भी एक महत्वपूर्ण सुधार है मूल निर्माण।
sort
अपने द्वारा चलाए जा रहे सामानों को अपने पास रख सकते हैं / कर सकते हैं ... श्रृंखला पर, जैसे कि सभी तत्व जो एक स्थिति के लिए मेल खाते हैं, वे एक छोर पर हैं, और बाकी सभी दूसरे पर हैं? यदि हां, तो आप देख सकते हैं कि यह तेज / अधिक सुरुचिपूर्ण है या नहीं। लेकिन याद रखें, यदि कोई प्रदर्शन समस्या नहीं है, तो अनुकूलन के बारे में चिंता करना बहुत जल्दी है।