logging - python函数对通用代码执行计时并将其写入日志文件
问题描述
每次我想写记录运行一些代码需要多长时间时,我都会用以下方式包装代码
logger.info('Running <MYCODE>' )
start_time = time.time()
<MYCODE>
logger.info("--- %s seconds ---" % (time.time() - start_time))
这使得代码非常非常不可读,非常非常快。
我知道 %timeit 的事情,但我认为它在这里不适用,因为我想记录并且因为我不想运行它 N 次以获得差异或类似的东西。
我在想我应该定义一个函数
def timing ( <MYCODE> ):
logger.info('Running <MYCODE>' )
start_time = time.time()
<MYCODE>
logger.info("--- %s seconds ---" % (time.time() - start_time))
但我不确定这是个好主意。首先,因为看起来很多人已经遇到并解决了比我的 5 分钟解决方案更好的问题,其次因为我必须处理这个函数的返回......它返回什么?以及如何传递我想要运行的整段代码?我很困惑,看起来有人已经为此编写了一些装饰器......
解决方案
import time
import inspect
def timed(f:callable):
start = time.time()
ret = f()
elapsed = 1000*(time.time() - start)
source_code=inspect.getsource(f).strip('\n')
logger.info(source_code+": "+str(elapsed)+" seconds")
return ret
可以使用
a = timed(lambda: np.sin(np.pi))
推荐阅读
- shell - 更新现有存档文件
- c++ - 优化稀疏下三角线性系统的反向求解
- php - 从另一个实现一个功能
- c# - 主应用程序中的 ASP.NET Core 3.1 主机子应用程序
- javascript - 两列中的谷歌应用脚本搜索将匹配的行作为二维数组
- c# - WinForm 按钮在 1-2 次使用后停止工作
- r - The length of trainPred is not correct in prediction function with R
- scala - Scala解析器组合器几乎是最后一个
- javascript - 将相同长度的数组组合成对象数组
- html - AMP 仅适用于文章页面?