Dies ist eine Folgefrage zu einer Antwort, die ich vor ein paar Tagen gegeben habe . Bearbeiten: Es scheint, dass das OP dieser Frage bereits den Code verwendet hat, den ich an ihn gesendet habe, um dieselbe Frage zu stellen , aber ich war mir dessen nicht bewusst. Entschuldigung. Die Antworten sind jedoch unterschiedlich!
Im Wesentlichen habe ich Folgendes beobachtet:
>>> 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]
... oder mit anderen Worten: Die elseKlausel ist schneller, unabhängig davon, welche ifBedingung ausgelöst wird oder nicht.
Ich nehme an, es hat mit dem unterschiedlichen Bytecode zu tun, der von den beiden generiert wurde, aber kann jemand dies im Detail bestätigen / erklären?
BEARBEITEN: Es scheint, dass nicht jeder in der Lage ist, meine Timings zu reproduzieren. Daher hielt ich es für nützlich, einige Informationen zu meinem System anzugeben. Ich verwende Ubuntu 11.10 64-Bit mit dem installierten Standard-Python. pythongeneriert die folgenden Versionsinformationen:
Python 2.7.2+ (default, Oct 4 2011, 20:06:09)
[GCC 4.6.1] on linux2
Hier sind die Ergebnisse der Demontage in Python 2.7:
>>> 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- aber wie gesagt, er wird nie erreicht) am Ende von with_else. Ich bezweifle sehr, dass toter Code eine Funktion schneller macht. Könnte jemand eine disauf 2.7 zur Verfügung stellen?
elseund Falsewar am langsamsten von allen (152ns). Die zweitschnellste war Trueohne else(143 ns) und zwei andere waren im Grunde gleich (137 ns und 138 ns). Ich habe keinen Standardparameter verwendet und ihn %timeitin iPython gemessen .
with_elsespürbar schneller ist.