VizTracer 0.8.0, 不改源代码,功能更强大

距离上个minor已经接近一个月了,和之前预计的一样,VizTracer的更新频率有了明显的下降。不过这一个月我也没有搁置VizTracer,还是有了不少进展的。

尽管在0.7.*的版本里,大部分的版本更新都是bug fix,但是促使我把版本提升到0.8.0的这个feature还是我非常喜欢的——log_var

我们在debug的时候经常会试图print一些variable,很常见的做法就是在修改这个variable之后后面加一个print()。然而每次debug完我们还要一个一个把print()删掉。更令人厌烦的是如果这个值在若干个地方被修改,我们可能要在每个地方都加个print(),无论是增加还是删除,都很麻烦。

这个版本的VizTracer提供了一个不修改源代码就可以查看变量随时间变化的方法,而且使用起来非常容易

viztracer --log_var <varname> --run your_script.py

这里用了--run 来去除歧义,因为--log_var可以后面跟若干个变量名。

在使用了log_var之后,每当变量名为<varname>的变量被修改时,VizTracer都会把这个event记录下来,然后你可以在最终的report里看到这个值什么时候被修改的,被修改成了什么。VizTracer是用Instant Event来记录的。

不仅如此,对于<varname>,VizTracer是支持regular expression的。也就是你可以在这个位置输入regex,VizTracer会自动帮你match。你可以用类似:

viztracer --log_var a.* --run your_script.py

来记录所有a开头的变量的变化情况。

并且,这个regex match是在compile time完成的,也就是re的引入本身是不会对performance造成额外影响的。

记录之后的结果大概是这样:

注意每一个黄线都是一个event,可以点击来查看event里发生了什么事情。

在此基础之上,如果你要跟踪的variable是一个数值,你还可以用log_number

viztracer --log_number <varname> --run your_script.py 

log_numberlog_var的区别在于,log_number是用的counter event,也就是会单独列出一个signal,并且用高度来表示数值的大小,类似下图:

当然,每个位置依然是可以点击查看详细信息的。

这个功能的出现基本可以让你随意的在不修改代码的情况下查看任何变量随时间的变化了。

在这个最重要的feature之外,0.8.0也带来了一些其他的新feature。

首先呢,是可以通过log_gc来记录garbage collector的运行情况了。当我们看到下面这张图:

一个mcts,为什么中间有两块比其他的iteration慢了那么多呢?然后看一下上面紫色的signal就知道,哦,原来是garbage collection在运行。

另外还加了一个小option --open,可以让你在运行完viztracer之后直接用浏览器打开report。算是个小小的糖吧。

viztracer --open your_script.py 

还有个比较重要的事情就是,VizTracer开始正式支持python3.9了(在3.9正式版release的第二天)。所以体验3.9的小伙伴,VizTracer可以陪你一起!

其实在这个版本,VizTracer还修复了若干个很重大的bug(会导致某些feature压根没法用),可能是因为用VizTracer的人还不多,所以一些比较偏的feature bug没人发现:)

最后依然是希望大家可以来试用VizTracer,多提建议。相信我,这是一款超级好用的python神器!

https://github.com/gaogaotiantian/viztracergithub.com

发布于 10-10

文章被以下专栏收录