또 다른 질문 에서 수락 된 답변은 성능 향상을 위해 Python 코드의 (매우 저렴한) if 문을 try / except 블록으로 대체하는 것이 좋습니다.
코딩 스타일 문제는 제쳐두고 예외가 트리거되지 않는다고 가정 할 때 예외 처리기를 사용하는 것이 (성능 측면에서) 예외 처리기를 사용하는 것과없는 경우와 비교하여 0으로 비교하는 if 문을 사용하는 것이 얼마나 많은 차이를 만들까요?
또 다른 질문 에서 수락 된 답변은 성능 향상을 위해 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
버전이 훨씬 더 빠릅니다.
try/except
더 빠릅니다if a != 0
이 질문은 실제로 디자인 및 역사 FAQ에 답변되어 있습니다 .
예외가 발생하지 않으면 try / except 블록이 매우 효율적입니다. 실제로 예외를 잡는 것은 비용이 많이 듭니다.
이 질문은 잘못된 것입니다. 예외가 트리거 되지 않는다고 가정하면 둘 다 최적의 코드가 아닙니다.
예외가 오류 조건의 일부로 트리거된다고 가정하면 이미 최적의 코드를 원하는 영역을 벗어난 것입니다 (어쨌든 이와 같은 세분화 된 수준에서 처리하지 않을 수도 있습니다).
표준 제어 흐름의 일부로 예외를 사용하는 경우 (파이썬의 "권한이 아닌 용서 요청"방식) 예외가 트리거되고 비용은 예외의 종류에 따라 달라집니다. 및 예외가 발생하는 시간의 백분율.