Mesurer les frais généraux des décorateurs
Votre patron a écrit un décorateur appelé check_everything()
qu'il trouve génial, et il insiste pour que vous l'utilisiez dans votre fonction. Cependant, vous avez remarqué que lorsque vous l'utilisez pour décorer vos fonctions, celles-ci s'exécutent beaucoup plus lentement. Vous devez convaincre votre patron que le décorateur ajoute trop de temps de traitement à votre fonction. Pour ce faire, vous allez mesurer la durée d'exécution de la fonction décorée et la comparer à la durée d'exécution de la fonction non décorée. Il s'agit du décorateur en question :
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
Cet exercice fait partie du cours
Écrire des fonctions en Python
Instructions
- Appelez la fonction originale au lieu de la version décorée en utilisant un attribut de la fonction que l'instruction
wraps()
du décorateur de votre patron a ajouté à la fonction décorée.
Exercice interactif pratique
Essayez cet exercice en complétant cet exemple de code.
@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))