CommencerCommencer gratuitement

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

Afficher le cours

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