LoslegenKostenlos loslegen

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

Kurs anzeigen

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))
Code bearbeiten und ausführen