Esta es una pregunta de seguimiento a una respuesta que di hace unos días . Editar: parece que el OP de esa pregunta ya usaba el código que le publiqué para hacerle la misma pregunta , pero no estaba al tanto. Disculpas Sin embargo, las respuestas proporcionadas son diferentes.
Sustancialmente observé que:
>>> 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]
... o en otras palabras: tener la elsecláusula es más rápida independientemente de la ifcondición que se active o no.
Supongo que tiene que ver con un código de bytes diferente generado por los dos, pero ¿alguien puede confirmar / explicar en detalle?
EDITAR: Parece que no todos pueden reproducir mis tiempos, por lo que pensé que podría ser útil dar información sobre mi sistema. Estoy ejecutando Ubuntu 11.10 64 bit con el python predeterminado instalado. pythongenera la siguiente información de versión:
Python 2.7.2+ (default, Oct 4 2011, 20:06:09)
[GCC 4.6.1] on linux2
Estos son los resultados del desmontaje en 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_VALUEpero, como se dijo, nunca se alcanza) al final de with_else. Dudo mucho que el código muerto haga que una función sea más rápida. ¿Alguien podría proporcionar un dis2.7?
elsey Falsefue el más lento de todos (152ns). El segundo más rápido fue Truesin else(143ns) y otros dos fueron básicamente iguales (137ns y 138ns). No %timeitutilicé el parámetro predeterminado y lo midí en iPython.
with_elsees notablemente más rápido.