Подтвердить что ты не робот

Стоимость обработчиков исключений в Python

В еще один вопрос, принятый ответ предложил заменить (очень дешевый) оператор if в коде Python блоком try/except для повышения производительности.

Проблемы с кодированием в сторону, и если предположить, что исключение никогда не запускается, то какая разница делает (с точки зрения производительности) иметь обработчик исключений по сравнению с отсутствием одного из них по сравнению с показателем if-statement с равным нулю

4b9b3361

Ответ 1

Почему бы вам не измерить его, используя timeit module? Таким образом, вы можете узнать, относится ли это к вашему приложению.

ОК, поэтому я просто попробовал следующее:

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))

Результат:

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

Итак, как и ожидалось, отсутствие обработчика исключений немного быстрее (но взорвется на вашем лице при возникновении исключения), а try/except быстрее, чем явный if, пока условие не выполняется.

Но все это в том же порядке и вряд ли имеет значение в любом случае. Только если условие действительно выполнено, версия if выполняется значительно быстрее.

Ответ 3

Этот вопрос вводит в заблуждение. Если вы считаете, что исключение никогда не срабатывает, ни один из них не является оптимальным кодом.

Если вы считаете, что исключение инициируется как часть условия ошибки, вы уже находитесь за пределами области поиска оптимального кода (и вы, вероятно, не обрабатываете его на таком же мелкозернистом уровне).

Если вы используете исключение как часть стандартного потока управления - это Pythonic "просить прощения, а не разрешения", то исключение будет инициировано, а стоимость зависит от вида исключения, вид if, и какой процент времени вы оцениваете исключение.