python 性能分析庫使用

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

相關文章
相關標籤/搜索