cProfile和Python:找出代码耗时最多的具体行号

5 投票
3 回答
3114 浏览
提问于 2025-04-15 14:42

我正在使用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开发的。

撰写回答