Python의 예외 처리기 비용


97

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

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


6
측정했을 때 무엇을 배웠습니까?
S.Lott


부분을 ​​제외하고 제어 할 가능성이 더 적 으면 try / except를 사용하고 기회가 더 많으면 if / else를 사용합니다.
shadow0359 dec.

답변:


112

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


3
흥미 롭군. 그래서 try/except더 빠릅니다if a != 0
Thilo

10
Ahh, 훌륭한 단어 선택 : "모두 같은 크기 내에 있습니다."... 예외를 피하는 많은 사람들이 예외가 10 배 더 느릴 것으로 기대하고 있다고 생각합니다.
Garrett Bluma 2011

python 2.7.5로 Fedora에서 코드를 실행하면 a = 1 일 때 "if"버전 (0.08 usec / pass)이 "try / except"버전 (0.11 usec / pass)보다 빠릅니다.
duleshi

@duleshi 흥미 롭군요. x86 / x64 일까? 아니면 다른 프로세서 확장이 있습니까?
Basic

58

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

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


3
"매우 효율적"이 얼마나 효율적인지 궁금했습니다. 매우 간단한 "if"문보다 빠르다.
Thilo

게시 한 내용은 디자인 및 역사 FAQ 에서 발췌 한 것 입니다.
nitsas

아마도 "매우 효율적"이란 Java에서 수행되는 것과 같은 것을 의미 할까요?
ebk

18

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.