You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计被多场景调用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 11:07:39