如何统计被多场景调用的Python函数func的总执行时间与调用次数?
极简统计方案实现
首先修正你现有装饰器的明显错误:原装饰器最后返回的是wrapper()(直接执行了包装函数),这会导致装饰器逻辑失效,正确写法应该返回wrapper本身。
针对你的需求,利用装饰器的闭包特性就能实现累加统计,无需额外复杂逻辑,方案如下:
import time def track_func(func): # 闭包内维护统计变量,仅初始化一次 call_count = 0 total_exec_time = 0.0 def wrapper(*args, **kwargs): nonlocal call_count, total_exec_time st = time.time() result = func(*args, **kwargs) elapsed = time.time() - st # 累加统计数据 call_count += 1 total_exec_time += elapsed # 可选:打印单次执行信息 print(f"单次执行时长: {elapsed:.4f}秒") return result # 给包装函数添加属性,方便外部获取统计结果 wrapper.call_count = lambda: call_count wrapper.total_exec_time = lambda: total_exec_time return wrapper # 装饰目标函数 @track_func def func(x): time.sleep(x) return x
使用说明
- 不管
func被何处调用(包括其他包内的隐式调用),只要是经过装饰后的func,都会被自动统计 - 获取统计数据时,直接调用包装函数的属性方法:
# 示例调用 func(1) func(2) func(0.5) print(f"总调用次数: {func.call_count()}") print(f"总执行时长: {func.total_exec_time():.4f}秒")
方案优势
- 仅依赖Python内置特性,无需引入第三方库
- 统计逻辑完全封装在装饰器内,不侵入原函数代码
- 自动覆盖所有对
func的调用,无需手动修改每个调用处
内容的提问来源于stack exchange,提问作者Whisht
相关产品推荐
相关产品推荐

