1. 程式人生 > >效能分析與程式碼覆蓋率測試

效能分析與程式碼覆蓋率測試

效能分析

對程式碼優化的前提是需要了解效能瓶頸在什麼地方,程式執行的主要時間是消耗在哪裡,對於比較複雜的程式碼可以藉助一些工具來定位,python 內建了豐富的效能分析工具,如 profile,cProfile 與 hotshot 等。其中 Profiler 是 python 自帶的一組程式,能夠描述程式執行時候的效能,並提供各種統計幫助使用者定位程式的效能瓶頸。Python 標準模組提供三種 profilers:cProfile,profile 以及 hotshot。

cprofile 的使用非常簡單,只需要在使用之前進行 import 即可。具體例項如下:

import cProfile

def CountLetters(file_name,n,stopName,verbName):
    //內容不足為外人道也 哈哈可以自己隨便寫
cProfile.run("CountLetters('../gone_with_the_wind.txt',10, None, None)")

程式的執行結果如下:

圖 1. 效能分析結果

上圖有個字打錯啦 呼叫不是待用

引數官方解釋:

其中輸出每列的具體解釋如下:

●ncalls:表示函式呼叫的次數;

●tottime:表示指定函式的總的執行時間,除掉函式中呼叫子函式的執行時間;

●percall:(第一個 percall)等於 tottime/ncalls;

●cumtime:表示該函式及其所有子函式的呼叫執行的時間,即函式開始呼叫到返回的時間;

●percall:(第二個 percall)即函式執行一次的平均時間,等於 cumtime/ncalls;

●filename:lineno(function):每個函式呼叫的具體資訊;

如果需要將輸出以日誌的形式儲存,只需要在呼叫的時候加入另外一個引數。如

profile.run("CountLetters('../gone_with_the_wind.txt',10, None, None)","testprof")

接著說

程式碼覆蓋率測試

coverage.py是一個用來統計python程式程式碼覆蓋率的工具。它使用起來非常簡單,並且支援最終生成介面友好的html報告。在最新版本中,還提供了分支覆蓋的功能。

通過pip安裝

pip install coverage

Coverage Command Line 

命令列使用說明: 詳見:

http://nedbatchelder.com/code/coverage/cmd.html

最關鍵核心的幾個引數使用如下:

1. run

執行程式碼覆蓋率統計,只需要通過coverage的run引數執行被統計程式碼即可。

$ coverage run Count.py arg1 arg2

跑完後,會自動生成一個覆蓋率統計結果檔案(data file):.coverage。arg1,arg2是啥可以自己查那個連結,因為我還沒看。

2. report

有了覆蓋率統計結果檔案,只需要再執行report引數,就可以在命令裡看到統計的結果。

$ coverage report


Name       Stmts   Miss  Cover
------------------------------
Count.py     260    212    18%

 

3. html

最帥最酷的功能了,直接生成html的測試報告。

$ coverage html -d covhtml

生成的報告非常酷,直接關聯程式碼,高亮顯示覆蓋和未覆蓋的程式碼,支援排序。可以在這個地址預覽一下:

file:///F:/ASE/project28_10/basic/covhtml/index.html

file:///F:/ASE/project28_10/basic/covhtml/Count_py.html

效果如下:

算了不放圖啦 自己點開連結

發現連結點不開,還是放圖吧

 

其中紅色的就是未覆蓋的。

 

也可以直接點選下圖中的

 

注:coverage run test.py命令執行的檔案,會統計專案中包括測試檔案本身在內的所有檔案,run引數的子引數—source可以指定要統計的檔案:$ coverage run --source=totest.py test.py 可以只統計totest.py檔案。