cProfile 是python提供的一个C扩展插件,运行开销小,因此适合于分析长时间运行的程序。python
写个简单例子函数
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 在指定的函数中消耗的总时间(不包括调用子函数的时间)ui
percall 是tottime除以 ncalls 的商
cumtime 指定的函数及其全部的子函数(从调用到推出)消耗的累积时间。这个数字对于递归函数是准确的。
percall 是cumtime除以原始调用次数的商(即函数运行一次的平均时间)
filename:lineno(function) 提供相应数据的每一个函数插件
若是第一列中有两个数字(例如13529/1),则表示函数递归。第二个值是原始调用次数,第一个是调用的总次数。而当函数不递归时,这两个值时相同的,而且只打印单个数字。code