यह an answer I gave a few days back पर एक फॉलो-अप प्रश्न है। संपादित करें: ऐसा लगता है कि उस प्रश्न के ओपी पहले से ही the same question पूछने के लिए कोड मैं उसे करने के लिए तैनात थे, लेकिन मैं इसके बारे में अनजान था। क्षमा याचना। हालांकि दिए गए उत्तर अलग हैं!जल्दी से वापसी धीमी क्यों है?
काफी हद तक मैंने देखा कि:
>>> def without_else(param=False):
... if param:
... return 1
... return 0
>>> def with_else(param=False):
... if param:
... return 1
... else:
... return 0
>>> from timeit import Timer as T
>>> T(lambda : without_else()).repeat()
[0.3011460304260254, 0.2866089344024658, 0.2871549129486084]
>>> T(lambda : with_else()).repeat()
[0.27536892890930176, 0.2693932056427002, 0.27011704444885254]
>>> T(lambda : without_else(True)).repeat()
[0.3383951187133789, 0.32756996154785156, 0.3279120922088623]
>>> T(lambda : with_else(True)).repeat()
[0.3305950164794922, 0.32186388969421387, 0.3209099769592285]
... या दूसरे शब्दों में: else
खंड होने if
हालत या ट्रिगर नहीं किया जा रहा है तेजी से परवाह किए बिना।
मुझे लगता है कि यह दो द्वारा उत्पन्न विभिन्न बाईटकोड से कोई लेना देना नहीं है, लेकिन किसी को भी इस बात की पुष्टि/विस्तार से व्याख्या करने में सक्षम है?
संपादित करें: ऐसा लगता है कि हर कोई मेरे समय को पुन: उत्पन्न करने में सक्षम नहीं है, इसलिए मैंने सोचा कि यह मेरे सिस्टम पर कुछ जानकारी देने के लिए उपयोगी हो सकता है। मैं डिफ़ॉल्ट पायथन स्थापित के साथ उबंटू 11.10 64 बिट चला रहा हूं।
>>> dis.dis(without_else)
2 0 LOAD_FAST 0 (param)
3 POP_JUMP_IF_FALSE 10
3 6 LOAD_CONST 1 (1)
9 RETURN_VALUE
4 >> 10 LOAD_CONST 2 (0)
13 RETURN_VALUE
>>> dis.dis(with_else)
2 0 LOAD_FAST 0 (param)
3 POP_JUMP_IF_FALSE 10
3 6 LOAD_CONST 1 (1)
9 RETURN_VALUE
5 >> 10 LOAD_CONST 2 (0)
13 RETURN_VALUE
14 LOAD_CONST 0 (None)
17 RETURN_VALUE
SO पर एक समान प्रश्न था, अब मुझे नहीं मिल रहा है। उन्होंने उत्पन्न बाइटकोड की जांच की और एक अतिरिक्त कदम था। देखे गए मतभेद परीक्षक (मशीन, एसओ ..) पर बहुत निर्भर थे, कभी-कभी केवल बहुत ही छोटे अंतर पाते थे। – joaquin
3.x पर, दोनों unreachable कोड ('LOAD_CONST (कोई नहीं); RETURN_VALUE' के लिए ** समान ** बाइटकोड सहेजते हैं - लेकिन जैसा कि कहा गया है, यह कभी नहीं पहुंचा है)' with_else' के अंत में। मुझे अत्यधिक संदेह है कि मृत कोड एक समारोह को तेज बनाता है। क्या कोई 2.7 पर 'डी' प्रदान कर सकता है? – delnan
मैं इसे पुन: उत्पन्न करने में सक्षम नहीं था। 'Else' और 'गलत' के साथ फ़ंक्शन उन सभी में से सबसे धीमा था (152ns)। दूसरा सबसे तेज़ 'ट्रू' था बिना 'else' (143ns) और दो अन्य मूल रूप से वही थे (137ns और 138ns)। मैंने डिफ़ॉल्ट पैरामीटर का उपयोग नहीं किया और इसे iPython में '% timeit' के साथ मापा। – rplnt