간단한 작업 인 'list_l에서 x를 제거하십시오.'에 대한 if/then 워크 플로우보다 빠른 워크 플로우가 필요하다고 가정했습니다. 아래 예제에서 예외가 발생할 확률은 시간의 16.6 %이지만 예외 예외 (x는 list_l에 없음)는 권한 요청보다 많습니다 (x가 list_l에있는 경우). 왜?파이썬 속도 테스트 - 왜 예외적 인 실패는 많은 시간을 들여야합니까?
import random, time, timeit
class Timer(object):
def __enter__(self):
self.start = time.time()
return self
def __exit__(self, *args):
self.end = time.time()
self.secs = self.end - self.start
self.msecs = self.secs * 1000 # millisecs
def a_function():
a_list = list(xrange(10))
choice_list = list(xrange(12))
choice = random.choice(choice_list)
try:
a_list.remove(choice)
except ValueError:
pass
def b_function():
a_list = list(xrange(10))
choice_list = list(xrange(12))
choice = random.choice(choice_list)
if choice in a_list:
a_list.remove(choice)
with Timer() as a:
print('test_a', timeit.timeit("a_function()", number=10000, setup="from __main__ import a_function"))
with Timer() as b:
print('test_b', timeit.timeit("b_function()", number=10000, setup="from __main__ import b_function"))
결과 :도
1st attempt: ('test_a', 0.029724836349487305)('test_b', 0.027068138122558594)
2nd attempt: ('test_a', 0.02960801124572754)('test_b', 0.026785850524902344)
3rd attempt: ('test_a', 0.029654979705810547)('test_b', 0.02665996551513672)
, I가 증가하는 경우
여기서 I 부호화 시험과 그 결과는 choice_list 범위를 20으로 설정하면 예외가 더 자주 발생하기 때문에 차이가 넓어집니다. 파이썬이 강력하게 용서가 아닌 허가를 요구한다면, 왜 실패가 시간면에서 비용이 많이 드는 것 같습니까?
시도/캐치는 경우/다음과 같은 구조 (조건부 점프)를 포함해야합니다. 더 많은 일을 처리해야하기 때문에 (오류가 무엇인지 알려주는 것처럼), try/catch는 필자가 직접 테스트하는 것보다 느리게 진행될 것이다. – zebediah49
'타이머'컨텍스트 관리자는 무엇을합니까? 그것은 죽은 코드 인 것처럼 보입니다. 그리고 여러분은 이미'timeit'을 고소하고 있습니다. – delnan
@delnan 처음으로 속도 테스트 코드를 시작했을 때 Timer가 어려웠을 수도 있습니다. 내가 일반적으로하는 일은 단순히 함수를 코드화하는 것뿐입니다. – Cole