To pytanie uzupełniające do odpowiedzi, której udzieliłem kilka dni temu . Edycja: wydaje się, że OP tego pytania użył już kodu, który mu wysłałem, aby zadać to samo pytanie , ale nie byłem tego świadomy. Przeprosiny. Podane odpowiedzi są jednak inne!
Zasadniczo zauważyłem, że:
>>> 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]
... lub innymi słowy: posiadanie else
klauzuli jest szybsze, niezależnie od tego, czy if
warunek zostanie wyzwolony, czy nie.
Zakładam, że ma to związek z innym generowanym przez nich kodem bajtowym, ale czy ktoś jest w stanie potwierdzić / wyjaśnić szczegółowo?
EDYCJA: Wydaje się, że nie wszyscy są w stanie odtworzyć moje czasy, więc pomyślałem, że przydatne może być podanie pewnych informacji w moim systemie. Używam 64-bitowego systemu Ubuntu 11.10 z zainstalowanym domyślnym pythonem. python
generuje następujące informacje o wersji:
Python 2.7.2+ (default, Oct 4 2011, 20:06:09)
[GCC 4.6.1] on linux2
Oto wyniki dezasemblacji w Pythonie 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
- jak już wspomniano, nigdy nie został osiągnięty) na końcu with_else
. Wątpię, czy martwy kod przyspiesza działanie funkcji. Czy ktoś może podać dis
2,7?
else
i False
była najwolniejsza ze wszystkich (152ns). Drugi najszybszy był True
bez else
(143ns), a dwa pozostałe były w zasadzie takie same (137ns i 138ns). Nie użyłem parametru domyślnego i zmierzyłem go %timeit
w iPython.
with_else
jest zauważalnie szybszy.