Aan de slagGa gratis aan de slag

Decorator-overhead meten

Je baas heeft een decorator geschreven, check_everything(), waarvan die denkt dat hij geweldig is, en hij staat erop dat je hem op je functie gebruikt. Je merkt echter dat je functies er veel trager door worden. Je moet je baas overtuigen dat de decorator te veel verwerkingstijd toevoegt aan je functie. Om dit te laten zien ga je meten hoe lang de gedecoreerde functie nodig heeft om te draaien en dat vergelijken met hoe lang de ongedecoreerde functie nodig zou hebben. Dit is de 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

Deze oefening maakt deel uit van de cursus

Functies schrijven in Python

Cursus bekijken

Oefeninstructies

  • Roep de oorspronkelijke functie aan in plaats van de gedecoreerde versie door een attribuut te gebruiken dat de wraps()-instructie in de decorator van je baas aan de gedecoreerde functie heeft toegevoegd.

Praktische interactieve oefening

Probeer deze oefening eens door deze voorbeeldcode in te vullen.

@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 bewerken en uitvoeren