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

Python:使用装饰器测量函数执行时间的问题及解决诉求

问题根源先搞清楚

你遇到的这个"时间差异"其实是个常见的误解:你感受到的3秒耗时根本不是幂运算的计算时间,而是把那个几十万位的超大整数转换为字符串、再输出到控制台的时间!Python的**运算符底层是用C实现的高效计算,99999**99999的计算本身确实只需要0.0001秒左右,而打印这个天文数字才是真正的耗时环节。

原装饰器的逻辑是只统计some_function(*args, **kwargs)的执行时间——也就是纯计算的时间,所以当你让函数返回结果时,装饰器给出的短时间是准确的;而当你在函数里打印结果再返回None时,装饰器统计的是"计算+打印"的总时间,所以得到了3秒左右的数值,但代价是函数返回None。

解决方案:按需选择统计范围

根据你的需求,有两种可行的处理方式:

1. 只想统计纯计算时间(保留原函数返回值)

这种情况下原装饰器本身是没问题的,你看到的0.0001秒就是真实的计算耗时。如果你觉得"实际运行时长约3秒",那是因为你在外部打印结果的时间没被统计进去——这部分不属于函数运行时间,而是后续输出操作的开销。

直接用原装饰器即可,调用后可以拿到结果和计算时间:

@decorator_timer
def my_pow(a, b):
    return a ** b

result, calc_time = my_pow(99999, 99999)
print(f"纯计算耗时:{calc_time}秒")
# 如果你需要打印结果,这部分的时间不计入函数运行时间
print(result)

2. 需要统计"计算+打印结果"的总时间(同时保留返回值)

如果你的目标是把输出结果的时间也纳入统计,那可以把打印逻辑整合到装饰器或者函数里,这里推荐更灵活的装饰器方案:

def decorator_timer(print_result=False):
    def inner_wrap(some_function):
        from time import time
        def wrapper(*args, **kwargs):
            t_start = time()
            result = some_function(*args, **kwargs)
            # 按需打印结果,这部分时间会被统计进去
            if print_result:
                print(result)
            total_time = time() - t_start
            return result, total_time
        return wrapper
    return inner_wrap

# 使用装饰器时指定需要打印结果
@decorator_timer(print_result=True)
def my_pow(a, b):
    return a ** b

# 调用后同时拿到结果和总耗时
final_result, total_duration = my_pow(99999, 99999)
print(f"计算+打印总耗时:{total_duration}秒")

这样既保留了函数的返回值,又能准确统计包含打印在内的总耗时。

另外也可以选择把打印逻辑直接写到my_pow函数里,这样原装饰器也能统计到总时间,但灵活性不如带参数的装饰器。


内容的提问来源于stack exchange,提问作者Roman Leontovych

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 08:47:31