Mesure de la surcharge du décorateur
Votre supérieur hiérarchique a développé un décorateur appelé check_everything() qu'il considère comme remarquable, 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, cela les ralentit considérablement. Il est nécessaire de convaincre votre supérieur que le décorateur augmente considérablement le temps de traitement de votre fonction. Pour ce faire, vous allez mesurer le temps d'exécution de la fonction décorée et le comparer au temps d'exécution de 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
Cet exercice fait partie du cours
Écrire des fonctions en Python
Instructions
- 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 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))