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

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

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


person Thilo    schedule 26.03.2010    source источник
comment
Что вы узнали, когда измерили его?   -  person S.Lott    schedule 26.03.2010
comment
Связанный вопрос: stackoverflow.com/questions/1835756   -  person tzot    schedule 26.03.2010
comment
Используйте try / except, если шансы на управление за исключением части меньше и if / else, если шансы больше.   -  person shadow0359    schedule 09.12.2016


Ответы (4)


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

Хорошо, я только что попробовал следующее:

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 работает значительно быстрее, только если условие действительно выполняется.

person Tim Pietzcker    schedule 26.03.2010
comment
Интересный. Итак, try/except быстрее, чем if a != 0 - person Thilo; 26.03.2010
comment
Ах, хороший выбор слов: все в одном порядке ... Я подозреваю, что многие люди, избегающие исключений, ожидают, что они будут в 10 раз медленнее. - person Garrett Bluma; 07.11.2011
comment
Запуск вашего кода в моей Fedora с python 2.7.5 показывает, что версия if (0,08 мксек / проход) быстрее, чем try / except one (0,11 мксек / проход), когда a = 1. - person duleshi; 09.05.2014
comment
@duleshi Интересно. Интересно, это что за x86 / x64? Или, может быть, разные расширения процессора? - person Basic; 09.08.2016


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

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

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

person Community    schedule 18.09.2010

В Python 3.11

“Zero-cost” exceptions are implemented. The cost of try statements is almost eliminated when no exception is raised. (Contributed by Mark Shannon in bpo-40222.)

https://docs.python.org/3.11/whatsnew/3.11.html#optimizations

person SuperNova    schedule 16.07.2021