cProfile和Python:找出代码耗时最多的具体行号
我正在使用cProfile、pstats和Gprof2dot来分析一个比较长的Python脚本。
结果显示,花费最多时间的是我定义的一个对象中的一个方法。不过,我其实更想知道这个方法内部具体哪一行代码耗时最多。
有没有什么办法可以获取这些额外的信息呢?
(顺便提一下,我是在OSX雪豹系统上使用Python 2.6,如果这有帮助的话…)
3 个回答
2
cProfile
这个工具不能追踪一个函数内部的每一行代码,它只能告诉你这个函数是在哪一行被定义的。
cProfile
试图模仿 profile
的行为,后者是用纯 Python 写的。profile
使用 pstats
来保存运行时的数据,而 pstats
只记录函数定义的行号,并不记录每一条 Python 语句的行号。
如果你想更详细地了解哪些地方耗费了你太多时间,那你需要把一个大函数拆分成几个小函数。
2
假设某个程序消耗的时间是40%。那么如果你在随机的时间点中断程序或者暂停它,有40%的概率你会看到这个程序在调用栈上被清晰地显示出来。也就是说,如果你这样做10次,差不多有4次你会看到它。
3
在Python中,有一个叫做line profiler的工具,是由Robert Kern开发的。