这是对上一篇关于调试器的文章的一个小小的补充。
标准库有三种分析方法(cProfile和profile,hotshot)以及不计其数的第三方可视化工具,转化器,以及诸如此类的东西。
工具多了,不靠谱的建议自然少不了。
如果你不知道该用什么,那就用一个可视化的工具吧!
有很多的建议供你选择自己要用的可视化工具,但无论是使用如标准库的Stats模块这种文本形式的还是像pycallgraph或者gprof2dot这样的图形化的库,第一反应都是要写代码来生成报表。
但是这个主意很糟糕,你需要不断修改代码来改变或者探索报表的内容。如果你不是在寻找一块特定的代码块,那么一切会变得混乱不堪。你很可能会错过那些真正扼杀你程序性能的事情。
RunSnakeRun
你可以用pip install RunSnakeRun 或者 apt-get install runsnakerun来安装或者从源码安装。
RunSnakeRun 是一个全面的工具,很容易集成 – 你可以和cProfile/profile来配合使用,只需要给profile.run方法指定一个filename的参数即可,比如:
1 2 |
import cProfile cProfile.run("main()", filename="my.profile") |
然后,在终端里运行:
1 |
runsnake my.profile |
结果看起来就像这样:
这是可接受的,如果你的分析文件不是特别大的话,它会工作的很好。比如:你只有一个占用了太多运行时间的函数。
RunSnakeRun有一个内存调试模式(需要Meliae)。遗憾的是我还没有试过。但是如果你想看到内存的使用情况,它看起来确实很有用。就像这样。
KCachegrind
你可以用apt-get install kcachegrind 来安装或者从源码安装。
鲜为人知的秘密:有windows版本的KCachegrind二进制包。 只需要安装windows版本的KDE,然后在选项“开发者工具”选中它,很可能要取消选择其他项)。
我真的很喜欢这工具!它可以向你展示调用树的图表,可排序的调用表,调用/被调用的地图,源代码,而且你还能选择过滤掉所有的东西。而且它是语言无关的 – 如果你有C/C++背景的话,你很可能听说过这个工具。
我喜欢这个工具的程度超过RunSnakeRun,因为它比后者功能要强大的多:
- 在调用数的图表上,你可以排序,改变布局/用很多方法来渲染或者导出成点图/png,RunSnakeRun甚至不能显示调用树的图表
- 你可以看见源码
- 你可以得到被调用地图
- 更容易安装(不需要依赖wxPython)
在大项目里面哪些需要关注并不是那么显而易见,或者有很多的相关函数时,KCachegrind比RunSnakeRun更值得一用。
可生成KCachegrind 分析文件的工具
我想这是唯一的缺点,你需要用这种特殊的格式导出。但是它也有很好的支持:
- django扩展的runprofileserver
- kcachegrind 转换器
- repoze.profile – 只需要设置cachegrind_filename
我使用的是函数装饰器,无非在你的/tmp目录下多了些导出的分析文件。
附上截图:
还有值得一提的工具?请评论留言!