Il s'agit d'une question complémentaire à une réponse que j'ai donnée il y a quelques jours . Edit : il semble que le PO de cette question ait déjà utilisé le code que je lui ai posté pour demander la même question mais je n'étais pas au courant. Je m'excuse. Les réponses fournies sont pourtant différentes !
En gros, j'ai observé cela :
>>> 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]
...ou en d'autres termes : avoir le else
est plus rapide indépendamment de la clause if
la condition étant déclenchée ou non.
Je suppose que cela a à voir avec le bytecode différent généré par les deux, mais quelqu'un peut-il confirmer/expliquer en détail ?
EDIT : Il semble que tout le monde ne soit pas capable de reproduire mes timings, alors j'ai pensé qu'il serait utile de donner quelques informations sur mon système. Je suis sous Ubuntu 11.10 64 bit avec le python installé par défaut. python
génère les informations de version suivantes :
Python 2.7.2+ (default, Oct 4 2011, 20:06:09)
[GCC 4.6.1] on linux2
Voici les résultats du désassemblage 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