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
Ö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))