關於Python Profilers性能分析器

1. 介紹性能分析器

profiler是一個程序,用來描述運行時的程序性能,而且從不一樣方面提供統計數據加以表述。Python中含有3個模塊提供這樣的功能,分別是cProfile, profile和pstats。這些分析器提供的是對Python程序的肯定性分析。同時也提供一系列的報表生成工具,容許用戶快速地檢查分析結果。html

Python標準庫提供了3個不一樣的性能分析器:python

  1. cProfile,推薦給大部分的用戶,是C的一個擴展應用,由於其合理的運行開銷,因此適合分析運行時間較長的。是基於lsprof。
  2. profile,一個純python模塊,它的接口和cProfile一致。在分析程序時,增長了很大的運行開銷。若是你想擴展profiler的功能,能夠試着繼承這個模塊
  3. hotshot, 一個試驗性的c模塊,關注減小分析時的運行開銷,可是是以須要更長的數據後處理的次數爲代價。不過這個模塊再也不被維護,也有可能在新的python版本中被棄用。

2. 使用方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
def foo():
     sum = 0
     for i in range ( 10000 ):
         sum + = i
     sumA = bar()
     sumB = bar()
     return sum
     
def bar():
     sum = 0
     for i in range ( 100000 ):
         sum + = i
     return sum
  
if __name__ = = "__main__" :
     import cProfile
 
     #直接把分析結果打印到控制檯
     cProfile.run( "foo()" )
     #把分析結果保存到文件中,不過內容可讀性差...須要調用pstats模塊分析結果
     cProfile.run( "foo()" , "result" )
     #還能夠直接使用命令行進行操做
     #>python -m cProfile myscript.py -o result
     
     import pstats
     #建立Stats對象
     p = pstats.Stats( "result" )
     #這一行的效果和直接運行cProfile.run("foo()")的顯示效果是同樣的
     p.strip_dirs().sort_stats( - 1 ).print_stats()
     #strip_dirs():從全部模塊名中去掉無關的路徑信息
     #sort_stats():把打印信息按照標準的module/name/line字符串進行排序
     #print_stats():打印出全部分析信息
 
     #按照函數名排序
     p.strip_dirs().sort_stats( "name" ).print_stats()
 
     #按照在一個函數中累積的運行時間進行排序
     #print_stats(3):只打印前3行函數的信息,參數還可爲小數,表示前百分之幾的函數信息
     p.strip_dirs().sort_stats( "cumulative" ).print_stats( 3 )
 
     #還有一種用法
     p.sort_stats( 'time' , 'cum' ).print_stats(. 5 , 'foo' )
     #先按time排序,再按cumulative時間排序,而後打倒出前50%中含有函數信息
 
     #若是想知道有哪些函數調用了bar,可以使用
     p.print_callers( 0.5 , "bar" )
 
     #同理,查看foo()函數中調用了哪些函數
     p.print_callees( "foo" )

以上是profile以及pstats模塊的簡單應用.算法

3.分析結果圖解

profile result

4. 什麼是肯定性性能分析(Deterministic Profiling)

肯定性性能分析指的是反映全部的函數調用,返回,和異常事件的執行所用的時間,以及它們之間的時間間隔。相比之下,統計性性能分析指的是取樣有效的程序指令,而後推導出所須要的時間,後者花費比較少的開銷,可是給出的結果不夠精確。函數

在Python中,由於其是解釋性語言,因此在執行程序的時候,會加入解釋器的執行,這部分的執行是不須要進行性能分析的。Python自動爲每個事件提供一個hook,來定位須要分析的代碼。除此以外,由於Python解釋型語言的本質每每須要在執行程序的時候加入不少其它的開銷,而肯定性性能分析只會加入一點點處理開銷。這樣一來,肯定性性能分析其實開銷不大,還能夠提供豐富的統計信息。工具

函數調用次數的統計可以被用於肯定程序中的bug,好比一個不符合常理的次數,明顯偏多之類的,還能夠用來肯定可能的內聯函數。函數內部運行時間的統計可被用來肯定」hot loops」,那些須要運行時間過長,須要優化的部分;累積時間的統計可被用來肯定比較高層次的錯誤,好比算法選擇上的錯誤。Python的性能分析能夠容許直接比較算法的遞歸實現與迭代實現的。oop

相關文章
相關標籤/搜索