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