Вимірювання накладних витрат декоратора
Ваш керівник написав декоратор 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))