Ne pas réfléchir, ne vous étonnez pas, mesure - avec timeit
à la coquille ligne de commande (de loin la meilleure, la façon la plus simple de l'utiliser!). Python 2.5.4 sur Mac OS X 10.5 sur un ordinateur portable ...:
$ python -mtimeit -s'x=0' 'if x: d=1' 'else: d=2'
10000000 loops, best of 3: 0.0748 usec per loop
$ python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops, best of 3: 0.0685 usec per loop
$ python -mtimeit -s'x=0' 'd=2' 'if x: d=1'
10000000 loops, best of 3: 0.0734 usec per loop
$ python -mtimeit -s'x=1' 'd=2' 'if x: d=1'
10000000 loops, best of 3: 0.101 usec per loop
Vous voyez: le « juste si » forme peut sauver 1,4 nanosecondes lorsque x est faux, mais coûte 40,2 nanosecondes lorsque x est vrai , par rapport au formulaire "if/else"; donc, dans un contexte de micro-optimisation, vous devriez utiliser le premier seulement si x est 30 fois plus susceptible d'être faux que vrai, ou à peu près. Aussi:
$ python -mtimeit -s'x=0' 'd=1 if x else 2'
10000000 loops, best of 3: 0.0736 usec per loop
$ python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops, best of 3: 0.076 usec per loop
... l'opérateur ternaire du if/else a ses propres plus et moins minuscules. Lorsque les différences sont aussi minimes, vous devez mesurer à plusieurs reprises, déterminer le niveau de bruit et vous assurer de ne pas prendre en compte les différences «dans le bruit». Par exemple, pour comparer la déclaration vs expression if/else dans le « x est vrai » cas, répéter chacun plusieurs fois:
$ python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops, best of 3: 0.076 usec per loop
$ python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops, best of 3: 0.0749 usec per loop
$ python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops, best of 3: 0.0742 usec per loop
$ python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops, best of 3: 0.0749 usec per loop
$ python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops, best of 3: 0.0745 usec per loop
vous pouvez maintenant affirmer que les formes d'expression prend (sur cette machine et les versions de clé logiciel) 74,2 à 76,0 nanosecondes - la gamme est beaucoup plus expressive que n'importe quel nombre unique serait. Et de même:
$ python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops, best of 3: 0.0688 usec per loop
$ python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops, best of 3: 0.0681 usec per loop
$ python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops, best of 3: 0.0687 usec per loop
$ python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops, best of 3: 0.0679 usec per loop
$ python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops, best of 3: 0.0692 usec per loop
maintenant vous pouvez affirmer avec confiance que le formulaire de déclaration prend (dans des conditions identiques) 67,9 à 69,2 nanosecondes; donc son avantage, pour x vrai, par rapport à la forme d'expression, est de 4,8 à 8,1 nanosecondes (il est juste de limiter cette estimation à 6,3 à 6,8 nanosecondes, comparant min/min et max/max au lieu de min/max et max/min que l'estimation plus large, plus prudentielle fait).
Combien de temps et d'énergie vaut la peine de consacrer à ces différences microscopiques, une fois que vous avez réalisé pour un soin donné qu'ils sont microscopique, est, bien sûr, un problème différent.
Lorsque vous les avez comparés avec le temps, qu'avez-vous appris? S'il vous plaît ne demandez pas sur l'optimisation sans temps d'exécution. –
Merci, je n'étais pas au courant de timeit, je viens de le trouver et je construis un test de temps. –
-1 pour la micro-optimisation spéculative –