VizTracer,Python logging/profiling/debugging利器

2,384 阅读3分钟

小伙伴们大家好~今天来分享一下我这几个月做的开源项目 VizTracer 。先把地址给了。

github.com/gaogaotiant…

VizTracer 的核心功能是帮助你理解你的代码到底在干什么。它会 trace 你的 python code,记录每一次函数运行和返回的时间点,最后生成一个 html 文件把整个运行结果可视化,大概长这个样子:

viztracer

可能有些同学用过一些代码运行可视化的库,比如 gprof2dot 或者 snakeviz 之类,也可能大家觉得这个图和 flamegraph 也就是火焰图很像,但是 VizTracer 带来的信息和一切 profiler 是不太一样的。

如果仔细观察的话能看出来,VizTracer 的横轴是时间,它记录了所有事件(函数)发生的顺序,谁调用的谁,每一次运行的时间,而不是单纯地某个函数一共占了多少时间,或者是总结性的函数关系图。VizTracer 展示的数据是一切以 cProfile 为基础的库都没法展示的,因为 cProfile 压根就没记录这些数据。相比起这些"profiler",VizTracer 更像一个 logging tool 。

先简单说一下 VizTracer 怎么用吧。在设计之初,我的理念就是要让工具尽可能地好上手,所以 VizTracer 的使用其实特别容易:

pip install viztracer

viztracer your_script.py

是不是超级简单。基本上你只需要把原来的

python your_script.py arg1 arg2

变成

viztracer your_script.py arg1 arg2

就行了。

在运行之后,VizTracer 会在当前目录下生成一个result.html文件,用 chrome 打开它即可。我自己生成了一些demo,感兴趣的同学可以看一下。

除了最基础的记录函数 entry/exit 的功能之外,VizTracer 还有很多其他 loggin 功能,比较有趣的事,这里面有大量的功能是可以不改源代码就完成的。

举个例子,你可以让 VizTracer 记录每个函数的 arguments 和 return value,只需要

viztracer --log_return_value --log_function_args your_script.py

或者你可以让 VizTracer 记录任何符合某些 RegEx 的变量

viztracer --log_var <regex1> <regex2> --run your_script.py

这个的效果是,如果有一个变量的名称符合<regex1>或者<regex2>,VizTracer 就会在这个变量每次被 assign 之后记录一个 custom event,让你可以在 report 里看到它被改成什么值了。(这里增加了--run是为了去歧义,--log_var可以 take 任意多的值)

另外 VizTracer 还提供了一些 filter 功能,让你可以不记录你不感兴趣的内容。比如你可以只记录某些文件里的函数

viztracer --include_files ./src --run your_script.py

其实还有很多很多 feature,欢迎大家去试用一下,这里只介绍了开箱即用的不改代码的一少部分 feature,还有一些 custom event 可以修改源代码来更精确地记录数据的变化。

最后其实我想提一句的是,VizTracer 是我很认真对待的一个项目,不是当作玩具做的,我写了比较详细的文档(所有的 feature 都介绍了),test coverage 做到了 99.5%+,支持 Linux/MacOS/Windows 。另外为了追求 performance,VizTracer 的核心代码是纯 C 写的(所以只支持 CPython ),产生的 Overhead 和 cProfile 是差不多的,在 worst case 大概是 2x-3x 这个数量级(当然前提是没有 log 太多 custom 的东西)。

就先介绍到这里吧!欢迎大家试用以及提出宝贵意见哈!有任何问题可以下面留言,也可以直接去 github 给我提 issue~