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