Decorator-Overhead messen
Dein Chef hat einen Decorator namens check_everything() geschrieben, den er für großartig hält, und besteht darauf, dass du ihn in deiner Funktion verwendest. Dir ist jedoch aufgefallen, dass deine Funktionen damit deutlich langsamer laufen. Du musst deinen Chef davon überzeugen, dass der Decorator deiner Funktion zu viel Rechenzeit hinzufügt. Dazu misst du, wie lange die dekorierte Funktion für die Ausführung braucht, und vergleichst das mit der Zeit, die die undekorierte Funktion benötigt hätte. Das ist der betreffende Decorator:
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 ursprüngliche Funktion statt der dekorierten Version auf, indem du ein Attribut der Funktion verwendest, das die
wraps()-Anweisung in dem Decorator deines Chefs zur dekorierten Funktion hinzugefügt hat.
Interaktive Übung
Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.
@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))