Kom igångKom igång gratis

Mät dekoratörens inverkan på prestanda

Din chef har skrivit en dekoratör som heter check_everything() och är övertygad om att den är utmärkt – och insisterar på att du ska använda den i din funktion. Du har dock märkt att den gör funktionerna mycket långsammare. Nu behöver du övertyga din chef om att dekoratören lägger till för mycket bearbetningstid. För att göra det ska du mäta hur lång tid den dekorerade funktionen tar att köra och jämföra det med hur lång tid den odekorerade funktionen hade tagit. Det här är dekoratören i fråga:

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

Den här övningen är en del av kursen

Att skriva funktioner i Python

Visa kurs

Övningsinstruktioner

  • Anropa den ursprungliga funktionen i stället för den dekorerade versionen genom att använda ett attribut som wraps()-satsen i din chefs dekoratör har lagt till i den dekorerade funktionen.

Interaktiv övning med praktiskt arbete

Testa den här övningen genom att slutföra den här exempelkoden.

@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))
Redigera och kör kod