1、背景
业务基本代码堆积完毕了,部分流程需要调优,想着在几个关键执行路径上进行时间记录,类似 SQL 慢日志一样的方法,方便进行性能问题发现。
了解了下,应该是采用装饰器实现是代码侵入最小,最为优雅的一种方式。
底层原理支撑:
2、轮子
import time
from functools import wraps
def recording_time(func):
@wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
execution_time = (end_time - start_time) * 1000 # 将秒转换为毫秒
print(f"func '{func.__name__}' execute elapsed time: {execution_time:.6f} ms")
return result
return wrapper
def arecording_time(func):
@wraps(func)
async def wrapper(*args, **kwargs):
start_time = time.time()
result = await func(*args, **kwargs)
end_time = time.time()
execution_time = (end_time - start_time) * 1000 # 将秒转换为毫秒
print(f"func '{func.__name__}' execute elapsed time: {execution_time:.6f} ms")
return result
return wrapper
@recording_time
def cost_time():
time.sleep(2)
cost_time()
效果:
可以在装饰器中,将 print 替换成 【Python工具】Python 实现 telnet、loguru 框架下的 DEBUG 分级日志打印 中的 debug 等级的日志选项,在需要进行性能问题跟踪排查的时候开启,不需要的时候关闭。
在此,不赘述了哈,感兴趣可以自行移植到项目中使用。