ПочатиПочніть безкоштовно

Вимірювання накладних витрат декоратора

Ваш керівник написав декоратор 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))
Редагувати та запускати код