Python 性能剖分工具
Python?性能剖分工具
? ? ? ?眼看著項目即將完成,卻被測試人員告知沒有通過性能測試,這種情況在開發中屢見不鮮。接下來的工作就是加班加點地找出性能瓶頸,然后進行優化,再進行性能測試,如此這般周而復始直到通過性能測試。盡管豐富的工作經驗有助于性能優化,但只有科學地應用工具才能在最短的時間內找出最佳優化粒度的瓶頸代碼段,達到事半功倍的效果。
profile、cProfile與hotshot
?????????Python?內置了豐富的性能優化工具來幫助我們定位性能瓶頸,如:profile、cProfile和?hotshot。它們易于使用,而且有完備的支持文檔可供參考。下面以最常用的?profile?模塊為例來說明它們的使用方法,假定要剖分的腳本文件為?foo.py?,它的內容如下:
def foo():sum = 0for i in range(100):sum += ireturn sum if __name__ == "__main__":foo()對?foo.py?進行性能剖分的方法之一是修改?foo.py?里的?if?程序塊,引入?profile?模塊:
if __name__ == "__main__":import profileprofile.run("foo()")然后執行?foo.py?即可完成性能剖分,剖分結果將以文本報表的形式打印到標準輸出。
?????????因為上述方法需要修改?foo.py?文件,所以我們通常更傾向于使用無需修改源文件的方法——就是在命令行中用應用?python?的?–m?參數來執行?profile?:
python –m profile foo.py?????????除了可以使用?profile?模塊外,還可以使用?cProfile?模塊。cProfile由?C?語言實現,是剖分代價更低的剖分器,有和?profile?模塊相同的接口,但只能用于2.5或以上版本。Python?另一個內置的剖分器是?hotshot,但是?hotshot?模塊已經不再推薦使用,因為將來它可能會被移出標準庫。
pstats
?
????????無論使用哪個剖分器,它的剖分數據都可以保存到二進制文件,如foo.prof。分析和查看剖分結果文件需要使用?pstats?模塊,它極具伸縮性,可以輸出形式多樣的文本報表,是文本界面下不可或缺的工具。
?????????使用?pstats?分析剖分結果很簡單,幾行代碼就可以了:
import pstats p = pstats.Stats("foo.prof") p.sort_stats("time").print_stats()運行上述腳本將輸出結果為按函數內部運行時間(不計調用子函數的時間)長短排序的報表。
?????????sort_stats()?方法是?pstats.Stats?最重要的方法之一,它用以對剖分數據進行排序。sort_stats()?接受一個字符串參數,這個字符串標識了排序的字段,常用的可選的參數及其意義如下:
‘ncalls’ | 被調用次數 |
‘cumulative’ | 函數運行的總時間 |
‘nfl’ | Name/file/line |
‘time’ | 函數內部運行時間(不計調用子函數的時間) |
除了?sort_stats()?外,?pstats.Stats?還有?print_callees()?和?print_callers()?方法用以輸出指定函數所調用的函數和調用過指定函數的函數。
?????????除了編編程接口外,pstats?還提供了友好的命令行交互環境,在命令行執行?python –m pstats?就可以進入交互環境,在交互環境里可以使用 read/add?指令讀入/加載剖分結果文件,stats?指令用以查看報表,?callees?和?callers?指令用以查看特定函數的被調用者和調用者。下圖是?pstats?的截圖,標識了它的基本使用方法:
?
from :http://blog.csdn.net/gzlaiyonghao/article/details/2120147
轉載于:https://www.cnblogs.com/hehehaha/p/6332327.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Python 性能剖分工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二十四、oracle pl/sql 变量
- 下一篇: ASP.NET - 演练:创建网页以显示