import time import psutil import os from typing import Dict, Any, Callable from functools import wraps class PerformanceMonitor: """性能监控器""" def __init__(self): self.metrics = {} self.start_time = time.time() def start_monitoring(self): """开始监控""" self.start_time = time.time() self.initial_memory = psutil.Process(os.getpid()).memory_info().rss def stop_monitoring(self) -> Dict[str, Any]: """停止监控并返回性能指标""" end_time = time.time() final_memory = psutil.Process(os.getpid()).memory_info().rss metrics = { "execution_time": end_time - self.start_time, "memory_used": final_memory - self.initial_memory, "peak_memory": final_memory } return metrics def monitor_function(self, func: Callable) -> Callable: """装饰器:监控函数性能""" @wraps(func) def wrapper(*args, **kwargs): # 记录开始时间 start_time = time.time() start_memory = psutil.Process(os.getpid()).memory_info().rss try: # 执行函数 result = func(*args, **kwargs) return result finally: # 记录结束时间 end_time = time.time() end_memory = psutil.Process(os.getpid()).memory_info().rss # 记录指标 func_name = func.__name__ if func_name not in self.metrics: self.metrics[func_name] = { "call_count": 0, "total_time": 0, "total_memory": 0 } self.metrics[func_name]["call_count"] += 1 self.metrics[func_name]["total_time"] += (end_time - start_time) self.metrics[func_name]["total_memory"] += (end_memory - start_memory) return wrapper def get_metrics_report(self) -> str: """获取性能指标报告""" if not self.metrics: return "暂无性能数据" report = "性能指标报告:\n" report += "=" * 50 + "\n" for func_name, metrics in self.metrics.items(): avg_time = metrics["total_time"] / metrics["call_count"] avg_memory = metrics["total_memory"] / metrics["call_count"] report += f"函数: {func_name}\n" report += f" 调用次数: {metrics['call_count']}\n" report += f" 总执行时间: {metrics['total_time']:.4f}s\n" report += f" 平均执行时间: {avg_time:.4f}s\n" report += f" 总内存使用: {metrics['total_memory'] / 1024 / 1024:.2f}MB\n" report += f" 平均内存使用: {avg_memory / 1024 / 1024:.2f}MB\n" report += "-" * 30 + "\n" return report # 创建全局性能监控器实例 perf_monitor = PerformanceMonitor()