[python] Python의 예외 처리기 비용

다른 질문 에서 수락 된 답변은 성능 향상을 위해 Python 코드의 (매우 저렴한) if 문을 try / except 블록으로 대체하는 것이 좋습니다.

코딩 스타일 문제는 제쳐두고 예외가 트리거되지 않는다고 가정 할 때 예외 처리기를 사용하는 것이 (성능 측면에서) 예외 처리기를 사용하는 것과없는 경우와 비교하여 0으로 비교하는 if 문을 사용하는 것이 얼마나 많은 차이를 만들까요?



답변

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버전이 훨씬 더 빠릅니다.


답변

이 질문은 실제로 디자인 및 역사 FAQ에 답변되어 있습니다 .

예외가 발생하지 않으면 try / except 블록이 매우 효율적입니다. 실제로 예외를 잡는 것은 비용이 많이 듭니다.


답변

이 질문은 잘못된 것입니다. 예외가 트리거 되지 않는다고 가정하면 둘 다 최적의 코드가 아닙니다.

예외가 오류 조건의 일부로 트리거된다고 가정하면 이미 최적의 코드를 원하는 영역을 벗어난 것입니다 (어쨌든 이와 같은 세분화 된 수준에서 처리하지 않을 수도 있습니다).

표준 제어 흐름의 일부로 예외를 사용하는 경우 (파이썬의 “권한이 아닌 용서 요청”방식) 예외가 트리거되고 비용은 예외의 종류에 따라 달라집니다. 및 예외가 발생하는 시간의 백분율.


답변