यह एक अनुवर्ती प्रश्न है जिसका उत्तर मैंने कुछ दिन पहले दिया था । संपादित करें: ऐसा लगता है कि उस प्रश्न के ओपी ने पहले से ही उसी प्रश्न को पूछने के लिए मेरे द्वारा पोस्ट किए गए कोड का उपयोग किया था, लेकिन मैं इससे अनजान था। क्षमा याचना। प्रदान किए गए उत्तर हालांकि अलग हैं!
मुख्य रूप से मैंने देखा कि:
>>> 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
स्थिति तेज होने या न होने के बावजूद तेज होना।
मुझे लगता है कि यह दोनों द्वारा उत्पन्न अलग-अलग बायोटेक के साथ करना है, लेकिन क्या कोई विस्तार से पुष्टि / व्याख्या करने में सक्षम है?
संपादित करें: ऐसा लगता है कि हर कोई मेरी टाइमिंग को पुन: पेश करने में सक्षम नहीं है, इसलिए मैंने सोचा कि यह मेरे सिस्टम पर कुछ जानकारी देने के लिए उपयोगी हो सकता है। मैं Ubuntu 11.10 64 बिट डिफ़ॉल्ट अजगर स्थापित के साथ चला रहा हूं। python
निम्न संस्करण जानकारी उत्पन्न करता है:
Python 2.7.2+ (default, Oct 4 2011, 20:06:09)
[GCC 4.6.1] on linux2
यहाँ अजगर 2.7 में disassembly के परिणाम हैं:
>>> 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
LOAD_CONST(None); RETURN_VALUE
- लेकिन जैसा कि कहा गया है, यह कभी नहीं पहुंचता है) के अंत में with_else
। मुझे अत्यधिक संदेह है कि मृत कोड तेजी से कार्य करता है। किसी dis
2.7 पर प्रदान कर सकता है ?
else
और False
सबसे धीमा। दूसरा सबसे तेज True
बिना else
(143ns) था और दो अन्य मूल रूप से समान (137ns और 138ns) थे। मैंने डिफ़ॉल्ट पैरामीटर का उपयोग नहीं किया और इसे %timeit
iPython में मापा।
with_else
यह बहुत तेजी से बढ़ रहा है।