performance.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 性能优化模块
  5. """
  6. import asyncio
  7. import time
  8. from typing import Dict, Any
  9. from functools import wraps
  10. from logger import get_logger
  11. logger = get_logger("performance")
  12. def monitor_performance(func):
  13. """性能监控装饰器"""
  14. @wraps(func)
  15. async def async_wrapper(*args, **kwargs):
  16. start_time = time.time()
  17. try:
  18. result = await func(*args, **kwargs)
  19. execution_time = time.time() - start_time
  20. logger.info(f"{func.__name__} 执行完成,耗时: {execution_time:.2f}秒")
  21. return result
  22. except Exception as e:
  23. execution_time = time.time() - start_time
  24. logger.error(f"{func.__name__} 执行失败,耗时: {execution_time:.2f}秒,错误: {e}")
  25. raise
  26. @wraps(func)
  27. def sync_wrapper(*args, **kwargs):
  28. start_time = time.time()
  29. try:
  30. result = func(*args, **kwargs)
  31. execution_time = time.time() - start_time
  32. logger.info(f"{func.__name__} 执行完成,耗时: {execution_time:.2f}秒")
  33. return result
  34. except Exception as e:
  35. execution_time = time.time() - start_time
  36. logger.error(f"{func.__name__} 执行失败,耗时: {execution_time:.2f}秒,错误: {e}")
  37. raise
  38. if asyncio.iscoroutinefunction(func):
  39. return async_wrapper
  40. else:
  41. return sync_wrapper
  42. class PerformanceMonitor:
  43. """性能监控器"""
  44. def __init__(self):
  45. self.metrics: Dict[str, Any] = {}
  46. self.start_time = time.time()
  47. def start_timer(self, name: str):
  48. """开始计时"""
  49. self.metrics[name] = {"start": time.time()}
  50. def end_timer(self, name: str):
  51. """结束计时"""
  52. if name in self.metrics:
  53. self.metrics[name]["end"] = time.time()
  54. self.metrics[name]["duration"] = (
  55. self.metrics[name]["end"] - self.metrics[name]["start"]
  56. )
  57. logger.info(f"{name} 耗时: {self.metrics[name]['duration']:.2f}秒")
  58. def get_summary(self) -> Dict[str, Any]:
  59. """获取性能摘要"""
  60. total_time = time.time() - self.start_time
  61. return {
  62. "total_time": total_time,
  63. "metrics": self.metrics,
  64. "summary": f"总运行时间: {total_time:.2f}秒"
  65. }
  66. # 全局性能监控器
  67. perf_monitor = PerformanceMonitor()