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 else
Klausel ist schneller, unabhängig davon, welche if
Bedingung 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. python
generiert 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 dis
auf 2.7 zur Verfügung stellen?
else
und False
war am langsamsten von allen (152ns). Die zweitschnellste war True
ohne else
(143 ns) und zwei andere waren im Grunde gleich (137 ns und 138 ns). Ich habe keinen Standardparameter verwendet und ihn %timeit
in iPython gemessen .
with_else
spürbar schneller ist.