performance_stats.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import time
  2. import functools
  3. from collections import defaultdict
  4. from typing import Dict, List
  5. class PerformanceStats:
  6. """性能统计类,用于收集和展示方法执行时间"""
  7. _stats: Dict[str, List[float]] = defaultdict(list)
  8. @classmethod
  9. def add_execution_time(cls, func_name: str, execution_time: float):
  10. """添加执行时间记录"""
  11. cls._stats[func_name].append(execution_time)
  12. @classmethod
  13. def get_stats(cls) -> Dict[str, dict]:
  14. """获取统计结果"""
  15. results = {}
  16. for func_name, times in cls._stats.items():
  17. results[func_name] = {
  18. 'count': len(times),
  19. 'total_time': sum(times),
  20. 'avg_time': sum(times) / len(times),
  21. 'min_time': min(times),
  22. 'max_time': max(times)
  23. }
  24. return results
  25. @classmethod
  26. def print_stats(cls):
  27. """打印统计结果"""
  28. stats = cls.get_stats()
  29. print("\n性能统计结果:")
  30. print("-" * 80)
  31. print(f"{'方法名':<40} {'调用次数':>8} {'总时间(s)':>12} {'平均时间(s)':>12}")
  32. print("-" * 80)
  33. for func_name, data in stats.items():
  34. print(f"{func_name:<40} {data['count']:8d} {data['total_time']:12.6f} {data['avg_time']:12.6f}")
  35. def measure_time(func):
  36. """测量方法执行时间的装饰器"""
  37. @functools.wraps(func)
  38. def wrapper(*args, **kwargs):
  39. start_time = time.time()
  40. result = func(*args, **kwargs)
  41. execution_time = time.time() - start_time
  42. # 获取更详细的函数标识
  43. if hasattr(func, "__self__"): # 实例方法
  44. class_name = func.__self__.__class__.__name__
  45. full_name = f"{class_name}.{func.__name__}"
  46. elif hasattr(func, "__qualname__"): # 类方法或静态方法
  47. full_name = func.__qualname__
  48. else:
  49. module_name = func.__module__
  50. full_name = f"{module_name}.{func.__name__}"
  51. PerformanceStats.add_execution_time(full_name, execution_time)
  52. return result
  53. return wrapper