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
相关产品推荐
相关产品推荐

