1. 程式人生 > 實用技巧 >python 效能分析工具py-spy

python 效能分析工具py-spy

Py-Spy介紹

引用官方的介紹:

Py-Spy是Python程式的抽樣分析器。 它允許您視覺化檢視Python程式在哪些地方花了更多時間,整個監控方式無需重新啟動程式或以任何方式修改工程程式碼。 Py-Spy的開銷非常低:它是用Rust編寫的,速度與編譯的Python程式不在同一個程序中執行。 這意味著Py-Spy可以安全地用於生成生產環境中的Python應用調優分析。
github:https://github.com/benfred/py-spy

安裝

pip install py-spy

安裝後使用py-spy - h可以驗證安裝,並檢視使用幫助。

py-spy從命令列工作,並獲取要從中取樣的程式的PID或要執行的python程式的命令列。

py-spy具有三個子命令recordtopdump

  • record生成火焰圖
  • top實時檢視每個函式執行時間並統計
  • dump顯示每個python執行緒的當前呼叫堆疊

使用py-spy 生成火焰圖

​ py-spy是一個非常好用而且簡單的庫,看完他的readme 介紹文件基本就可以入手使用spy。這個工具一是可以生成profile 火焰圖,二是可以定位到程式中最耗時間的程式碼的位置。它的優點在於完全不用修改程式碼,相比較其他的一些效能調查工具,py-spy這一點非常棒,當你debug 一個線上正在執行的程式的時候,只需要提供程序id,py-spy 就可以直接生成火焰圖。

py-spy record -o profile.svg --pid 12345

或者

 py-spy record -o profile.svg-python myprogram.py

"12345" 為程式執行的pid,當執行這行命令的時候,py-spy 開始抽樣的程式simlple 並且生成火焰圖,我們可以等待1分鐘左右 ctrl+c 結束,這時候會在執行這行命令的當前目錄下生成 profile.svg 火焰圖, 如下圖:

 火焰圖的分析非常簡單直觀,主要是看"平頂",看圖中最下方那個峰頂是平的,那麼程式的效能問題就可以從這裡入手去解決,這裡不詳細介紹火焰圖看法,不明白的同學可以自行百度。

​ 通過生成火焰圖分析程式瓶頸大概率可以找到並解決80%的程式效能問題,但是還有一種問題,如果我的火焰圖沒有平頂,但是程式依舊很慢,該如何定位問題?

沒有平頂情況下,定位程式中耗時最多函式/程式碼

如下圖,通過火焰圖並沒有發現程式中的平頂

Top功能

這時候要用到py-spy 提供的 top 命令,Top顯示了在python程式中花費最多時間的功能的實時檢視,類似於unix top命令。

py-spy top --pid 12345

py-spy top-python myprogram.py

​ 輸入上述命令後,在控制檯會顯示程式實時的執行狀態,這裡可以介紹一下圖中4個引數的含義, 然後可以通過按1,2,3,4 四個按鍵,讓程式按照下圖所述排序。

  1按%Own排序(當前在該函式中花費的時間的百分比)
  2按%Total排序(函式及其子級中當前的時間百分比)
  3按OwnTime排序(函式中花費的總時間)
  4按TotalTime排序(該函式及其子項花費的總時間)

​ 比較直觀的 使用3 , 可以比較直接的看出程式執行中,所佔比消耗時間最多的函式,然後從函式如圖進行分析,如下圖,可以看出 是wrap 裝飾器函式消耗的時間最長,我們用wrapt 這個c寫的裝飾器進行替換後效率有了明顯的提升。

總結 : 使用py-spy 相對於其他一些python效能分析工具,優勢在於使用非常簡單,而且無須對程式碼做任何改動,並且可以在保護現場情況下,直接生成火焰圖,還可檢視實時程式執行狀態。

refer:

https://yq.aliyun.com/articles/741628