Python性能分析指南
譯文來源 | 開源中國
雖然你所寫的每個Python程序并不總是需要嚴密的性能分析,但是當這樣的問題出現(xiàn)時,如果能知道Python生態(tài)系統(tǒng)中的許多種工具,這樣總是可以讓人安心的。
分析一個程序的性能可以歸結為回答4個基本的問題:
1.它運行的有多塊?
2.那里是速度的瓶頸?
3.它使用了多少內存?
4.哪里發(fā)生了內存泄漏?
下面,我們將用一些很酷的工具,深入細節(jié)的回答這些問題。
使用time工具粗糙定時
首先,我們可以使用快速然而粗糙的工具:古老的unix工具time,來為我們的代碼檢測運行時間。
上面三個輸入變量的意義在文章 stackoverflow article 中有詳細介紹。簡單的說:
real – 表示實際的程序運行時間
user – 表示程序在用戶態(tài)的cpu總時間
sys – 表示在內核態(tài)的cpu總時間
通過sys和user時間的求和,你可以直觀的得到系統(tǒng)上沒有其他程序運行時你的程序運行所需要的CPU周期。
若sys和user時間之和遠遠少于real時間,那么你可以猜測你的程序的主要性能問題很可能與IO等待相關。
使用計時上下文管理器進行細粒度計時
我們的下一個技術涉及訪問細粒度計時信息的直接代碼指令。這是一小段代碼,我發(fā)現(xiàn)使用專門的計時測量是非常重要的:
timer.py
為了使用它,你需要用Python的with關鍵字和Timer上下文管理器包裝想要計時的代碼塊。它將會在你的代碼塊開始執(zhí)行的時候啟動計時器,在你的代碼塊結束的時候停止計時器。
這是一個使用上述代碼片段的例子:
我經常將這些計時器的輸出記錄到文件中,這樣就可以觀察我的程序的性能如何隨著時間進化。
使用分析器逐行統(tǒng)計時間和執(zhí)行頻率
Robert Kern有一個稱作line_profiler的不錯的項目,我經常使用它查看我的腳步中每行代碼多快多頻繁的被執(zhí)行。
想要使用它,你需要通過pip安裝該python包:
一旦安裝完成,你將會使用一個稱做“l(fā)ine_profiler”的新模組和一個“kernprof.py”可執(zhí)行腳本。
想要使用該工具,首先修改你的源代碼,在想要測量的函數(shù)上裝飾@profile裝飾器。不要擔心,你不需要導入任何模組。kernprof.py腳本將會在執(zhí)行的時候將它自動地注入到你的腳步的運行時。
primes.py
一旦你已經設置好了@profile裝飾器,使用kernprof.py執(zhí)行你的腳步。
-l選項通知kernprof注入@profile裝飾器到你的腳步的內建函數(shù),-v選項通知kernprof在腳本執(zhí)行完畢的時候顯示計時信息。上述腳本的輸出看起來像這樣:
尋找具有高Hits值或高Time值的行。這些就是可以通過優(yōu)化帶來最大改善的地方。
程序使用了多少內存?
現(xiàn)在我們對計時有了較好的理解,那么讓我們繼續(xù)弄清楚程序使用了多少內存。我們很幸運,F(xiàn)abian Pedregosa模仿Robert Kern的line_profiler實現(xiàn)了一個不錯的內存分析器。
首先使用pip安裝:
(這里建議安裝psutil包,因為它可以大大改善memory_profiler的性能)。
就像line_profiler,memory_profiler也需要在感興趣的函數(shù)上面裝飾@profile裝飾器:
想要觀察你的函數(shù)使用了多少內存,像下面這樣執(zhí)行:
一旦程序退出,你將會看到看起來像這樣的輸出:
line_profiler和memory_profiler的IPython快捷方式
memory_profiler和line_profiler有一個鮮為人知的小竅門,兩者都有在IPython中的快捷命令。你需要做的就是在IPython會話中輸入以下內容:
在這樣做的時候你需要訪問魔法命令%lprun和%mprun,它們的行為類似于他們的命令行形式。主要區(qū)別是你不需要使用@profiledecorator來修飾你要分析的函數(shù)。只需要在IPython會話中像先前一樣直接運行分析:
這樣可以節(jié)省你很多時間和精力,因為你的源代碼不需要為使用這些分析命令而進行修改。
內存泄漏在哪里?
cPython解釋器使用引用計數(shù)做為記錄內存使用的主要方法。這意味著每個對象包含一個計數(shù)器,當某處對該對象的引用被存儲時計數(shù)器增加,當引用被刪除時計數(shù)器遞減。當計數(shù)器到達零時,cPython解釋器就知道該對象不再被使用,所以刪除對象,釋放占用的內存。
如果程序中不再被使用的對象的引用一直被占有,那么就經常發(fā)生內存泄漏。
查找這種“內存泄漏”最快的方式是使用Marius Gedminas編寫的objgraph,這是一個極好的工具。該工具允許你查看內存中對象的數(shù)量,定位含有該對象的引用的所有代碼的位置。
一開始,首先安裝objgraph:
一旦你已經安裝了這個工具,在你的代碼中插入一行聲明調用調試器:
最普遍的對象是哪些?
在運行的時候,你可以通過執(zhí)行下述指令查看程序中前20個最普遍的對象:
哪些對象已經被添加或刪除?
我們也可以查看兩個時間點之間那些對象已經被添加或刪除:
誰引用著泄漏的對象?
繼續(xù),你還可以查看哪里包含給定對象的引用。讓我們以下述簡單的程序做為一個例子:
想要看看哪里包含變量x的引用,執(zhí)行objgraph.show_backref()函數(shù):
該命令的輸出應該是一副PNG圖像,保存在/tmp/backrefs.png,它看起來是像這樣:
在運行的時候,你可以通過執(zhí)行下述指令查看程序中前20個最普遍的對象:最下面有紅字的盒子是我們感興趣的對象。我們可以看到,它被符號x引用了一次,被列表y引用了三次。如果是x引起了一個內存泄漏,我們可以使用這個方法,通過跟蹤它的所有引用,來檢查為什么它沒有自動的被釋放。
回顧一下,objgraph 使我們可以:
顯示占據(jù)python程序內存的頭N個對象
顯示一段時間以后哪些對象被刪除活增加了
在我們的腳本中顯示某個給定對象的所有引用
努力與精度
在本帖中,我給你顯示了怎樣用幾個工具來分析python程序的性能。通過這些工具與技術的武裝,你可以獲得所有需要的信息,來跟蹤一個python程序中大多數(shù)的內存泄漏,以及識別出其速度瓶頸。
對許多其他觀點來說,運行一次性能分析就意味著在努力目標與事實精度之間做出平衡。如果感到困惑,那么就實現(xiàn)能適應你目前需求的最簡單的解決方案。
參考
stack overflow – time explained(堆棧溢出 – 時間解釋)
line_profiler(線性分析器)
memory_profiler(內存分析器)
objgraph(對象圖)
end
4個案例入門Scalene: 用perf測試Scalene的Overhead\/用Scalene測試Stable...
Scanlene是一個頂尖論文級別的Python性能分析工具,專為CPU、GPU和內存性能提供詳盡的剖析,擁有AI優(yōu)化建議功能。其安裝指令通過GitHub進行,如:GitHub - plasma-umass\/scalene。案例1展示了Scanlene的使用基礎及參數(shù)設置。以兩個數(shù)組生成為例,分別設置不同大小的數(shù)組用于測試,通過命令行調用Scanlene進行性能...
誰有有《利用Python進行數(shù)據(jù)分析》pdf 謝謝
利用python進行數(shù)據(jù)分析 鏈接: https:\/\/pan.baidu.com\/s\/15VdW4dcuPuIUEPrY3RehtQ ?pwd=3nfn 提取碼: 3nfn 本書也可以作為利用Python實現(xiàn)數(shù)據(jù)密集型應用的科學計算實踐指南。本書適合剛剛接觸Python的分析人員以及剛剛接觸科學計算的Python程序員。
【終極指南】使用Python可視化分析文本情感傾向
本文分享自華為云社區(qū) 《Python理解文本情感傾向的終極指南》,作者: 檸檬味擁抱。情感分析是一種通過自然語言處理技術來識別、提取和量化文本中的情感傾向的方法。Python在這一領域有著豐富的庫和工具,如NLTK、TextBlob和VADER等。本文將介紹如何使用Python進行情感分析,并通過可視化展示結果。首先,我們需要...
numba,讓python速度提升百倍
其效果可能有限,但它無疑是提升Python代碼執(zhí)行效率的一大利器。對于那些希望深入了解如何通過Python進行性能分析與優(yōu)化的讀者,推薦閱讀《Python性能分析與優(yōu)化》一書。這本書不僅講解了包括numba在內的多種優(yōu)化技術,還提供了豐富的語法優(yōu)化建議,是提高Python程序性能的寶貴資源。
用什么工具可以分析程序執(zhí)行時間
此外,除了Code::Blocks之外,還有一些專門的性能分析工具,例如Valgrind,它可以提供詳細的性能報告,包括程序執(zhí)行時間、內存使用情況等。使用Valgrind,開發(fā)者可以更深入地了解程序的運行效率和內存使用情況,從而進行針對性的優(yōu)化。對于其他編程語言,如Java或Python,也有相應的工具可以幫助分析程序執(zhí)行時間。
python怎么做大數(shù)據(jù)分析
Python 數(shù)據(jù)分析 掌握回歸分析的方法,通過線性回歸和邏輯回歸,其實你就可以對大多數(shù)的數(shù)據(jù)進行回歸分析,并得出相對精確地結論。這部分需要掌握的知識點如下:回歸分析:線性回歸、邏輯回歸 基本的分類算法:決策樹、隨機森林……基本的聚類算法:k-means……特征工程基礎:如何用特征選擇優(yōu)化模型 調參方法:...
7 個使用 bcc\/BPF 的性能分析神器
本文提供了使用BPF進行性能分析的強大功能概覽,重點展示了BPF的流行前端BCC及其在Fedora上的安裝指南。BCC附帶60多個性能分析工具,有助于充分利用Linux系統(tǒng)。這些工具可以直接通過SSH使用,或者一旦GUI監(jiān)控程序支持BPF功能,則可利用相同功能。此外,BCC并非唯一的前端選項。ply和bpftrace提供高級語言支持,簡化自...
【python床頭書系列】python pd.cut參數(shù)屬性方法用法權威詳解
在上述代碼中,bins 參數(shù)定義了年齡的分箱邊界,數(shù)據(jù)點將會根據(jù)這些邊界被劃分到相應的箱內。在選擇分箱方法時,我們需要考慮數(shù)據(jù)特點、業(yè)務需求和建模目的。自定義箱體適用于特定場景,比如當數(shù)據(jù)的分布不均勻或有特殊需求時。靈活選擇分箱方法可以更精確地反映數(shù)據(jù)特征,從而提高后續(xù)分析或模型的性能。在...
Python3教程002:怎么個性化定制Python3的程序開發(fā)軟件Spyder5.0.5...
以下步驟將幫助您調整軟件設置,包括語言、窗格布局、文件模板以及Python解釋器和工作目錄的設置。另外,本文還將介紹如何通過Spyder對Python程序進行代碼格式分析和性能分析,以優(yōu)化代碼。接下來,我們將從以下幾個方面詳細說明個性化定制過程:將Spyder5.0.5的默認語言由英文改為中文步驟包括激活Python3.8虛擬...
python比mysql快多少
本文將從2個維度來分析他們的性能,一個是直接使用,另一個是使用orm輔助使用,來對比三個的性能差別。mysql的python客戶端目前市場主流有三個,分別是mysqldb(mysqlclient),mysqlconnectorpython和pymysql。mysqldb(mysqlclient)是mysql官方推出基于C庫來寫mysql連接庫,非純python。之前mysqldb只支持python2,...
相關評說:
嫩江縣點焊: ______ python性能調試過程中最突出的問題就是耗時,性能測試工具有很多,像profiler,cprofiler等等,都是只能返回函數(shù)整體的耗時,而line_profiler就能夠很好解決這個問題(大家可以試試就知道了).怎么使用這個工具呢?網上大部分都是說在所需...
嫩江縣點焊: ______ 這種東西的缺點不在本身.而在于使用環(huán)境 我們都進入視窗時代N年了,平時點點鼠標就能操作,簡單明了.而用python這類東西以及用python做出來的很多東西,你會發(fā)現(xiàn)大量的使用命令行,這是反智的!你在使用這些東西的時候會發(fā)現(xiàn),很多東西都需要自己配置環(huán)境,相當?shù)睦速M時間.
嫩江縣點焊: ______ 分享十本學習Python的書籍,讓你學習Python從入門到精通,有興趣的可以一起看看.1、Python基礎教程(第2版 修訂版) 《Python基礎教程(第2版修訂版)》包括Python程序設計的方方面面,內容涉及的范圍較廣,既能為初學者夯實基礎,...