CommencezCommencez gratuitement

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

Voir le cours

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