| 123456789101112131415161718192021222324252627282930313233343536373839 |
- import time
- from functools import wraps
- from collections import defaultdict
- # Activer/désactiver le profiling directement ici
- ENABLE_PROFILING = False # False pour prod
- # STATS[name] = [count, total_time, max_time]
- STATS = defaultdict(lambda: [0, 0.0, 0.0])
- def profile(func):
- if not ENABLE_PROFILING:
- return func
- name = f"{func.__module__}.{func.__qualname__}"
- @wraps(func)
- def wrapper(*args, **kwargs):
- start = time.perf_counter()
- STATS[name][0] += 1
- try:
- return func(*args, **kwargs)
- finally:
- elapsed = time.perf_counter() - start
- STATS[name][1] += elapsed
- if elapsed > STATS[name][2]:
- STATS[name][2] = elapsed
- return wrapper
- def dump_stats():
- print("\n--- PROFILING STATS ---")
- for name, (count, total, max_t) in sorted(
- STATS.items(),
- key=lambda x: x[1][1],
- reverse=True
- ):
- avg = total / count if count else 0
- print(f"{name:60} {count:8} {total:10.4f}s avg={avg:.6f}s max={max_t:.6f}s")
|