Gemeinkosten für Dekorateure messen
Dein Chef hat einen Dekorator namens check_everything()
geschrieben, den er toll findet, und er besteht darauf, dass du ihn in deiner Funktion benutzt. Du hast aber bemerkt, dass deine Funktionen viel langsamer laufen, wenn du sie damit ausschmückst. Du musst deinen Chef davon überzeugen, dass der Dekorateur zu viel Bearbeitungszeit für deine Funktion benötigt. Dazu misst du, wie lange die dekorierte Funktion für die Ausführung benötigt und vergleichst sie mit der Zeit, die die nicht dekorierte Funktion für die Ausführung benötigt hätte. Dies ist der betreffende Dekorateur:
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
Diese Übung ist Teil des Kurses
Funktionen in Python schreiben
Anleitung zur Übung
- Rufe die Originalfunktion anstelle der dekorierten Version auf, indem du ein Attribut der Funktion verwendest, das die
wraps()
Anweisung im Dekorator deines Chefs der dekorierten Funktion hinzugefügt hat.
Interaktive Übung
Versuche dich an dieser Übung, indem du diesen Beispielcode vervollständigst.
@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))