CommencerCommencer gratuitement

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

Afficher le cours

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))
Modifier et exécuter le code