cProfile 是python提供的一个C扩展插件,运行开销小,所以适合于分析长时间运行的程序。
写个简单例子
import cProfile
fib = lambda n: 1 if n <= 2 else fib(n - 1) + fib(n - 2)
def test():
fib(20)
cProfile.run("test()")
输出:
13533 function calls (5 primitive calls) in 0.005 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.005 0.005 <string>:1(<module>)
13529/1 0.005 0.000 0.005 0.005 cProfile性能测试.py:3(<lambda>)
1 0.000 0.000 0.005 0.005 cProfile性能测试.py:5(test)
1 0.000 0.000 0.005 0.005 {built-in method builtins.exec}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
第一行显示监听了13533个调用。在这些调用用,有5个是原始的,这意味着调用不是通过递归引发的。
下面解释一下列标题:
ncalls 调用次数
tottime 在指定的函数中消耗的总时间(不包括调用子函数的时间)
percall 是tottime除以 ncalls 的商
cumtime 指定的函数及其所有的子函数(从调用到推出)消耗的累积时间。这个数字对于递归函数是准确的。
percall 是cumtime除以原始调用次数的商(即函数运行一次的平均时间)
filename:lineno(function) 提供相应数据的每个函数
如果第一列中有两个数字(例如13529/1),则表示函数递归。第二个值是原始调用次数,第一个是调用的总次数。而当函数不递归时,这两个值时相同的,并且只打印单个数字。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。