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),则表示函数递归。第二个值是原始调用次数,第一个是调用的总次数。而当函数不递归时,这两个值时相同的,并且只打印单个数字。

Scroll Up