Défi
Énoncé
Écrire un décorateur chrono qui enveloppe n'importe quelle fonction, mesure le temps écoulé pendant son exécution et imprime sur stderr un message de la forme "[chrono] nom_fonction : 42.31 ms" (deux décimales). La valeur de retour de la fonction originale doit être préservée. Démontrer avec une fonction calcul_lourd qui effectue une somme sur un grand nombre d'entiers.
Contraintes
- Python ≥ 3.6.
- Utiliser
time.perf_counter()pour la mesure. - Utiliser
functools.wrapspour préserver les métadonnées (__name__,__doc__) de la fonction décorée. - La sortie de chronométrage va sur
sys.stderr, la sortie normale sursys.stdout. - Format stderr :
[chrono] <nom> : <durée> msavec exactement deux décimales. - Bibliothèque standard uniquement (
time,functools,sys).
Exemple
import time, sys, functools
def chrono(fn):
@functools.wraps(fn)
def wrapper(*args, **kwargs):
debut = time.perf_counter()
resultat = fn(*args, **kwargs)
duree_ms = (time.perf_counter() - debut) * 1000
print(f"[chrono] {fn.__name__} : {duree_ms:.2f} ms", file=sys.stderr)
return resultat
return wrapper
@chrono
def calcul_lourd(n):
return sum(range(n))
print(calcul_lourd(10_000_000))
49999995000000
Sur stderr (durée variable) :
[chrono] calcul_lourd : 187.45 ms