데코레이터 오버헤드 측정하기
상사분이 check_everything()이라는 데코레이터를 만들었고, 이게 아주 훌륭하다고 하시며 꼭 사용하라고 합니다. 그런데 이 데코레이터를 쓰면 함수 실행이 훨씬 느려진다는 걸 발견했어요. 데코레이터가 함수에 과도한 처리 시간을 추가한다는 점을 설득력 있게 보여줘야 합니다. 이를 위해 데코레이팅된 함수의 실행 시간을 측정하고, 데코레이터가 없었을 때의 실행 시간과 비교하려고 합니다. 문제가 된 데코레이터는 아래와 같습니다:
def check_everything(func):
@wraps(func)
def wrapper(*args, **kwargs):
check_inputs(*args, **kwargs)
result = func(*args, **kwargs)
check_outputs(result)
return result
return wrapper
이 연습은 강의의 일부입니다
Python으로 함수 작성하기
연습 안내
- 상사의 데코레이터에 있는
wraps()문이 데코레이팅된 함수에 추가한 속성을 사용해, 데코레이팅된 버전이 아니라 원래 함수를 호출하세요.
실습형 인터랙티브 연습
이 예제를 이 샘플 코드를 완성하여 풀어보세요.
@check_everything
def duplicate(my_list):
"""Return a new list that repeats the input twice"""
return my_list + my_list
t_start = time.time()
duplicated_list = duplicate(list(range(50)))
t_end = time.time()
decorated_time = t_end - t_start
t_start = time.time()
# Call the original function instead of the decorated one
duplicated_list = duplicate.____(list(range(50)))
t_end = time.time()
undecorated_time = t_end - t_start
print('Decorated time: {:.5f}s'.format(decorated_time))
print('Undecorated time: {:.5f}s'.format(undecorated_time))