如何创建计时器统计函数两次执行间隔时长,大型项目中timeit模块是否适用?
结论
你的判断是正确的,timeit模块确实无法满足该场景的需求。
原因分析
timeit的设计定位是小段独立代码的基准性能测试,默认会重复执行目标代码数千次以统计平均耗时,无法嵌入到复杂项目的实际运行链路中追踪真实调用时序timeit无法兼容大型项目中函数的上下文依赖,项目内的函数运行依赖大量模块状态、入参上下文,timeit的独立运行模式无法复现实际的调用场景timeit没有内置的调用时序记录能力,无法自动留存同一函数前一次调用的时间戳,自然也不能计算相邻两次执行的时间差
适配大型项目的实现方案
推荐使用装饰器实现无侵入埋点,不需要修改原有业务代码即可完成统计,示例代码如下:
import time from functools import wraps from typing import Callable # 存储函数上一次执行的时间戳,多线程场景可以替换为 threading.local() 存储线程独立的时间戳 func_last_call_map = {} def track_call_interval(func: Callable) -> Callable: @wraps(func) def wrapper(*args, **kwargs): current_ts = time.perf_counter() # 用模块+函数名作为唯一标识,避免重名函数冲突 func_uniq_id = f"{func.__module__}.{func.__qualname__}" if func_uniq_id in func_last_call_map: interval = current_ts - func_last_call_map[func_uniq_id] # 可按需替换为写日志、上报监控系统等逻辑 print(f"函数 {func_uniq_id} 相邻调用间隔:{interval:.6f}s") # 更新上次调用时间 func_last_call_map[func_uniq_id] = current_ts return func(*args, **kwargs) return wrapper
使用时仅需要在要统计的目标函数上添加@track_call_interval装饰器即可。
内容的提问来源于stack exchange,提问作者Franz
相关产品推荐
相关产品推荐

