Mesurer la surcharge d'un décorateur
Votre supérieur a écrit un décorateur nommé check_everything() qu'il trouve extraordinaire et insiste pour que vous l'utilisiez dans votre fonction. Toutefois, vous avez remarqué que lorsqu'il décore vos fonctions, leur exécution devient beaucoup plus lente. Vous devez le convaincre que ce décorateur ajoute trop de temps de traitement à votre fonction. Pour cela, vous allez mesurer la durée d'exécution de la fonction décorée et la comparer au temps qu'aurait pris la fonction non décorée. Voici le 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
Cette activité fait partie du cours
Écrire des fonctions en Python
Instructions de l’exercice
- Appelez la fonction d'origine plutôt que la version décorée en utilisant un attribut de la fonction que l'instruction
wraps()dans le décorateur de votre supérieur a ajouté à la fonction décorée.
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
@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))