profil.py 944 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. import time
  2. from functools import wraps
  3. from collections import defaultdict
  4. # Activer/désactiver le profiling directement ici
  5. ENABLE_PROFILING = False # False pour prod
  6. # STATS[name] = [count, total_time, max_time]
  7. STATS = defaultdict(lambda: [0, 0.0, 0.0])
  8. def profile(func):
  9. if not ENABLE_PROFILING:
  10. return func
  11. name = f"{func.__module__}.{func.__qualname__}"
  12. @wraps(func)
  13. def wrapper(*args, **kwargs):
  14. start = time.perf_counter()
  15. STATS[name][0] += 1
  16. try:
  17. return func(*args, **kwargs)
  18. finally:
  19. elapsed = time.perf_counter() - start
  20. STATS[name][1] += elapsed
  21. if elapsed > STATS[name][2]:
  22. STATS[name][2] = elapsed
  23. return wrapper
  24. def dump_stats():
  25. print("\n--- PROFILING STATS ---")
  26. for name, (count, total, max_t) in sorted(
  27. STATS.items(),
  28. key=lambda x: x[1][1],
  29. reverse=True
  30. ):
  31. avg = total / count if count else 0
  32. print(f"{name:60} {count:8} {total:10.4f}s avg={avg:.6f}s max={max_t:.6f}s")