Pourquoi ne pas la mesurer à l'aide du timeit
module ? De cette façon, vous pouvez voir si c'est pertinent pour votre candidature.
OK, je viens d'essayer ce qui suit (en utilisant Python 3.11.1 sur Windows 11) :
import timeit
statements=["""\
try:
b = 10/a
except ZeroDivisionError:
pass""",
"""\
if a:
b = 10/a""",
"b = 10/a"]
for a in (1,0):
for s in statements:
t = timeit.Timer(stmt=s, setup='a={}'.format(a))
print("a = {}\n{}".format(a,s))
print("%.2f usec/pass\n" % (1000000 * t.timeit(number=100000)/100000))
Résultat :
a = 1
try:
b = 10/a
except ZeroDivisionError:
pass
0.06 usec/pass
a = 1
if a:
b = 10/a
0.05 usec/pass
a = 1
b = 10/a
0.03 usec/pass
a = 0
try:
b = 10/a
except ZeroDivisionError:
pass
0.27 usec/pass
a = 0
if a:
b = 10/a
0.02 usec/pass
a = 0
b = 10/a
Traceback (most recent call last):
File "<stdin>", line 5, in <module>
File "C:\Python311\Lib\timeit.py", line 178, in timeit
timing = self.inner(it, self.timer)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<timeit-src>", line 6, in inner
ZeroDivisionError: division by zero
Comme vous pouvez le constater, il n'y a pas de grande différence entre l'utilisation d'un try/except
par rapport à une clause explicite de if
à moins que l'exception ne soit déclenchée. (Et bien sûr, ne pas avoir de structure de contrôle est plus rapide, même si ce n'est pas de beaucoup, et cela fera planter le programme si quelque chose se passe mal).
Comparez ces résultats à ceux obtenus en 2010 :
a = 1
try:
b = 10/a
except ZeroDivisionError:
pass
0.25 usec/pass
a = 1
if a:
b = 10/a
0.29 usec/pass
a = 1
b = 10/a
0.22 usec/pass
a = 0
try:
b = 10/a
except ZeroDivisionError:
pass
0.57 usec/pass
a = 0
if a:
b = 10/a
0.04 usec/pass
a = 0
b = 10/a
ZeroDivisionError: int division or modulo by zero
Il semble que le PC que j'utilise aujourd'hui soit environ deux fois plus rapide que celui que j'avais à l'époque. Le coût du traitement d'une exception semble identique et les opérations "normales" (arithmétique) ont été améliorées encore plus que le traitement des structures de contrôle, mais la remarque faite il y a toutes ces années reste valable :
Tout cela est du même ordre de grandeur et n'a que peu d'importance dans un sens ou dans l'autre. Ce n'est que si la condition est effectivement remplie (souvent), que la if
est nettement plus rapide.