C'est une question complémentaire à une réponse que j'ai donnée il y a quelques jours . Edit: il semble que l'OP de cette question a déjà utilisé le code que je lui ai posté pour poser la même question , mais je n'étais pas au courant. Toutes mes excuses. Les réponses fournies sont cependant différentes!
En gros, j'ai 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]
... ou en d'autres termes: avoir la else
clause est plus rapide quelle que soit la if
condition déclenchée ou non.
Je suppose que cela a à voir avec un bytecode différent généré par les deux, mais est-ce que quelqu'un est capable de confirmer / expliquer en détail?
EDIT: Il semble que tout le monde ne soit pas capable de reproduire mes horaires, j'ai donc pensé qu'il pourrait être utile de donner des informations sur mon système. J'exécute Ubuntu 11.10 64 bits avec le python par défaut installé. 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émontage 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_VALUE
- mais comme indiqué, il n'est jamais atteint) à la fin de with_else
. Je doute fortement que le code mort rende une fonction plus rapide. Quelqu'un pourrait-il fournir un dis
sur 2.7?
else
et False
était le plus lent de tous (152 ns). Le deuxième plus rapide était True
sans else
(143ns) et deux autres étaient fondamentalement les mêmes (137ns et 138ns). Je n'ai pas utilisé de paramètre par défaut et je l'ai mesuré avec %timeit
dans iPython.
with_else
c'est plus rapide.