Измерение накладных расходов декоратора
Ваш руководитель написал декоратор 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))