Začněte nyníZačněte zdarma

Měření režijních nákladů dekorátoru

Tvůj šéf napsal dekorátor check_everything(), který považuje za skvělý, a trvá na tom, abys ho používal/a na svých funkcích. Všiml/a sis ale, že po jeho aplikaci běží funkce výrazně pomaleji. Potřebuješ šéfa přesvědčit, že dekorátor přidává příliš velkou výpočetní zátěž. Proto změříš, jak dlouho trvá běh dekorované funkce, a porovnáš to s tím, jak dlouho by trvalo spuštění nedekorované verze. Tady je dotyčný dekorátor:

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

Toto cvičení je součástí kurzu

Writing Functions in Python

Zobrazit kurz

Pokyny k cvičení

  • Místo dekorované verze zavolej původní funkci – využij k tomu atribut, který příkaz wraps() v šéfově dekorátoru přidal k dekorované funkci.

Interaktivní cvičení na vyzkoušení si v praxi

Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.

@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))
Upravit a spustit kód