Python性能分析工具py-spy原理用法解析
Py-Spy介紹
引用官方的介紹:
Py-Spy是Python程序的抽樣分析器。 它允許您可視化查看Python程序在哪些地方花了更多時間,整個監(jiān)控方式無需重新啟動程序或以任何方式修改工程代碼。 Py-Spy的開銷非常低:它是用Rust編寫的,速度與編譯的Python程序不在同一個進程中運行。 這意味著Py-Spy可以安全地用于生成生產(chǎn)環(huán)境中的Python應用調(diào)優(yōu)分析。
github:https://github.com/benfred/py-spy
安裝
pip install py-spy
安裝后使用py-spy - h可以驗證安裝,并查看使用幫助。
py-spy從命令行工作,并獲取要從中采樣的程序的PID或要運行的python程序的命令行。py-spy具有三個子命令record,top和dump:
- record生成火焰圖
- top實時查看每個函數(shù)運行時間并統(tǒng)計
- dump顯示每個python線程的當前調(diào)用堆棧
使用py-spy 生成火焰圖
py-spy是一個非常好用而且簡單的庫,看完他的readme 介紹文檔基本就可以入手使用spy。這個工具一是可以生成profile 火焰圖,二是可以定位到程序中最耗時間的代碼的位置。它的優(yōu)點在于完全不用修改代碼,相比較其他的一些性能調(diào)查工具,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 結(jié)束,這時候會在運行這行命令的當前目錄下生成 profile.svg 火焰圖, 如下圖:
火焰圖的分析非常簡單直觀,主要是看"平頂",看圖中最下方那個峰頂是平的,那么程序的性能問題就可以從這里入手去解決,這里不詳細介紹火焰圖看法,不明白的同學可以自行百度。
通過生成火焰圖分析程序瓶頸大概率可以找到并解決80%的程序性能問題,但是還有一種問題,如果我的火焰圖沒有平頂,但是程序依舊很慢,該如何定位問題?
沒有平頂情況下,定位程序中耗時最多函數(shù)/代碼
如下圖,通過火焰圖并沒有發(fā)現(xiàn)程序中的平頂
Top功能
這時候要用到py-spy 提供的 top 命令,Top顯示了在python程序中花費最多時間的功能的實時視圖,類似于unix top命令。
py-spy top --pid 12345
或
py-spy top-python myprogram.py
輸入上述命令后,在控制臺會顯示程序?qū)崟r的運行狀態(tài),這里可以介紹一下圖中4個參數(shù)的含義, 然后可以通過按1,2,3,4 四個按鍵,讓程序按照下圖所述排序。
- 按%Own排序(當前在該函數(shù)中花費的時間的百分比)
- 按%Total排序(函數(shù)及其子級中當前的時間百分比)
- 按OwnTime排序(函數(shù)中花費的總時間)
- 按TotalTime排序(該函數(shù)及其子項花費的總時間)
比較直觀的 使用3 , 可以比較直接的看出程序運行中,所占比消耗時間最多的函數(shù),然后從函數(shù)如圖進行分析,如下圖,可以看出 是wrap 裝飾器函數(shù)消耗的時間最長,我們用wrapt 這個c寫的裝飾器進行替換后效率有了明顯的提升。
總結(jié) : 使用py-spy 相對于其他一些python性能分析工具,優(yōu)勢在于使用非常簡單,而且無須對代碼做任何改動,并且可以在保護現(xiàn)場情況下,直接生成火焰圖,還可查看實時程序運行狀態(tài)。
火焰圖怎么看
首先你需要知道:
X方向是采樣時間。
Y方向是函數(shù)調(diào)用棧。
如果給你一個這樣的火焰圖,你應該得出什么信息:
1.a()是開始的執(zhí)行函數(shù),但沒有消耗cpu,在這個函數(shù)里執(zhí)行了b(),h()。
2.a()的兩個分支b()和h(),這表明a()里面可能有一個條件語句,繼續(xù)可以看到b()分支消耗的 CPU 大大高于h()。
3.h()函數(shù)沒有消耗cpu,cpu全被i()函數(shù)占有。
4.b()函數(shù)這條支路繼續(xù)往上,一直到d(),由d()函數(shù)的子函數(shù)e()消耗一部分cpu,f()下的g()消耗一部分cpu,你會發(fā)現(xiàn)d()的最右邊往上缺了一塊,這塊就是d()執(zhí)行消耗的cpu。
結(jié)論:
消耗cpu的函數(shù)為e(),g(),d(),i()。
因此,如果要調(diào)查性能問題,首先應該調(diào)查g(),其次是i()。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Pygame游戲開發(fā)之太空射擊實戰(zhàn)添加圖形篇
相信大多數(shù)8090后都玩過太空射擊游戲,在過去游戲不多的年代太空射擊自然屬于經(jīng)典好玩的一款了,今天我們來自己動手實現(xiàn)它,在編寫學習中回顧過往展望未來,在本課中,我們將討論如何在游戲中使用預先繪制的圖形2022-08-08淺談django model postgres的json字段編碼問題
下面小編就為大家分享一篇淺談django model postgres的json字段編碼問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01Requests什么的通通爬不了的Python超強反爬蟲方案!
今天帶大家學習Requests什么的通通爬不了的Python超強反爬蟲方案,文中有非常詳細的圖文介紹及代碼示例,對正在學習python的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05解決pip安裝第三方庫,但PyCharm中卻無法識別的問題for mac
這篇文章主要介紹了解決pip安裝第三方庫,但PyCharm中卻無法識別的問題for mac,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-09-09