Python腳本分析CPU使用情況

在這篇文章中借帘,我將討論一個工具,用以分析Python中CPU使用情況淌铐。CPU分析是通過分析CPU執(zhí)行代碼的方式來測量代碼的性能肺然,以此找到代碼中的不妥之處,然后處理它們腿准。

接下來我們將看看如何跟蹤Python腳本使用時CPU使用情況际起,重點關(guān)注以下幾個方面:

1、cProfile

2吐葱、line_profiler

3街望、pprofile

4、vprof

測量CPU使用率

對于這篇文章弟跑,我將主要使用與內(nèi)存分析中使用腳本相同的腳本灾前,具體如下:

另外,請記住孟辑,在PyPy2中哎甲,您需要使用與之配合的pip版本:

并且其他依賴項也將被安裝:

cProfile

在討論CPU分析時,最常用的工具之一是cProfile饲嗽,主要是因為它內(nèi)置在CPython2和PyPy2中炭玫。這是一個確定性的分析器,意味著在運行程序時會收集一組統(tǒng)計數(shù)據(jù)貌虾,例如我們代碼的各個部分的執(zhí)行次數(shù)或執(zhí)行時間吞加。此外,cProfile在系統(tǒng)上的開銷比其他內(nèi)置的分析器(配置文件)要低。

CPython2的用法很簡單:

如果您使用PyPy2:

其輸出如下:

即使使用這個文本輸出榴鼎,很容易看到我們的腳本多次調(diào)用了list.append方法伯诬。

如果我們使用gprof2dot,我們可以以圖形的方式看到cProfile輸出巫财。要使用它盗似,我們必須首先安裝graphviz,之后是一些依賴包平项,最后在Ubuntu上使用如下命令:

再次運行腳本:

我們得到以下output.png文件:

這樣更容易看到一切赫舒。我們來仔細看看它的輸出。您可以看到腳本中的函數(shù)調(diào)用如下:

1闽瓢、第一行:Python文件名接癌,行號和方法名稱

2、第二行:代碼塊占用全部時間的百分比

3扣讼、第三行:括號中缺猛,方法本身占全部時間的百分比

4、第四行:調(diào)用函數(shù)的次數(shù)

例如椭符,在頂部的第三個紅色方塊中荔燎,方法primes占用了98.28%的時間,其中65.44%的內(nèi)容在其中進行销钝,調(diào)用了40次有咨。其余的時間花在Python中的list.append(22.33%)和range(11.51%)中。

作為一個簡單的腳本蒸健,我們只需要重寫我們的腳本座享,具體的如下所示:

如果我們使用CPython2測量我們腳本的時間,

還有PyPy2:

我們通過使用PyPy2的CPython2和3.1X獲得了不錯的效果似忧,下面是cProfile的調(diào)用流程圖:

您還可以以編程方式使用cProfile渣叛,例如:

這在某些情況下很有用,例如多進程性能測量

line_profiler

此分析器在行級提供關(guān)于工作負載的信息橡娄。它使用Cython在C中實現(xiàn)诗箍,并將其與cProfile進行比較時發(fā)現(xiàn)其具有較小的開銷。

源代碼可以在這里找到挽唉,也可以在這里找到PyPI頁面滤祖。與cProfile相比,它具有一樣的開銷瓶籽,不過卻要花費12倍的時間來獲取配置文件匠童。

要使用它,您需要先通過pip添加它:pip install pip install Cython ipython == 5.4.1 line_profiler(CPython2)塑顺。這個分析器的一個主要缺點是它不支持PyPy汤求。

就像使用memory_profiler一樣俏险,您需要在要分析的函數(shù)中添加一個裝飾器。在我們的例子中扬绪,您需要在03.primes-v1.py中定義我們的primes函數(shù)之前添加@profile竖独。然后調(diào)用它:

你將得到如下輸出:

我們看到,重復調(diào)用list.append的兩個循環(huán)花了最多的時間挤牛。

pprofile

根據(jù)作者說明莹痢,pprofile是一個“線程測量和統(tǒng)計的純python分析器”。

它受到line_profiler的啟發(fā)墓赴,修復了很多缺點竞膳,但是由于它完全用Python編寫,所以它也可以與PyPy成功使用诫硕。與cProfile相比坦辟,使用CPython時的分析時間要多28倍,而使用PyPy時章办,分析時間要多10倍锉走,而且細節(jié)水平更加細化。

我們也支持PyPy纲菌!除此之外挠日,它支持剖析線程,這在各種情況下可能會很方便翰舌。

要使用它,您需要先通過pip添加它:pip install pprofile(CPython2)/ pypy -m pip install pprofile(PyPy)冬骚,然后調(diào)用它:

輸出與我們以前看到的不同椅贱,我們得到如下結(jié)果:

我們現(xiàn)在可以更詳細地看到一切。讓我們來看看輸出只冻。您可以獲得腳本的整個輸出庇麦,并且在每行之前,您可以看到對其進行的調(diào)用次數(shù)喜德,運行時間(秒)山橄,每次調(diào)用的時間和全局時間的百分比,pprofile為我們的輸出添加了額外的行(如第44和50行舍悯,以(call)開頭)與累積指標航棱。

再次,我們看到萌衬,重復調(diào)用list.append的兩個循環(huán)花了我們腳本中最多的時間饮醇。

vprof

vprof是一個Python分析器,為各種Python程序特性(如運行時間和內(nèi)存使用)提供豐富的交互式可視化秕豫。它是一個基于Node.JS的圖形化的顯示在網(wǎng)頁中的結(jié)果朴艰。

使用它观蓄,您可以看到與Python腳本相關(guān)的以下一個或全部:

1、CPU使用圖

2祠墅、代碼分析

3侮穿、內(nèi)存圖

4、代碼熱圖

要使用它毁嗦,您需要先通過pip添加它:pip install vprof(CPython2)/ pypy -m pip install vprof(PyPy)撮珠,然后調(diào)用它:

在CPython2上,顯示代碼散熱圖(第一個調(diào)用如下)和代碼分析(下面的第二個調(diào)用):

在PyPy上金矛,顯示代碼散熱圖(第一個調(diào)用如下)和代碼分析(下面的第二個調(diào)用):

在每種情況下芯急,您將看到代碼散點圖的以下內(nèi)容

以及代碼分析的以下內(nèi)容。

結(jié)果以圖形方式看到驶俊,我們可以懸停鼠標或單擊每行以獲取更多信息娶耍。再次,我們看到饼酿,重復調(diào)用list.append的兩個循環(huán)花了我們腳本中最多的時間榕酒。

英文原文:https://pythonfiles.wordpress.com/2017/06/01/hunting-performance-in-python-code-part-3/

譯者:buhaoxuesheng

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市故俐,隨后出現(xiàn)的幾起案子想鹰,更是在濱河造成了極大的恐慌,老刑警劉巖药版,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辑舷,死亡現(xiàn)場離奇詭異,居然都是意外死亡槽片,警方通過查閱死者的電腦和手機何缓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來还栓,“玉大人碌廓,你說我怎么就攤上這事∈:校” “怎么了谷婆?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辽聊。 經(jīng)常有香客問我纪挎,道長,這世上最難降的妖魔是什么身隐? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任廷区,我火速辦了婚禮,結(jié)果婚禮上贾铝,老公的妹妹穿的比我還像新娘隙轻。我一直安慰自己埠帕,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布玖绿。 她就那樣靜靜地躺著敛瓷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斑匪。 梳的紋絲不亂的頭發(fā)上呐籽,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音蚀瘸,去河邊找鬼狡蝶。 笑死,一個胖子當著我的面吹牛贮勃,可吹牛的內(nèi)容都是我干的贪惹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寂嘉,長吁一口氣:“原來是場噩夢啊……” “哼奏瞬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泉孩,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤硼端,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后寓搬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體珍昨,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年订咸,在試婚紗的時候發(fā)現(xiàn)自己被綠了曼尊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡脏嚷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瞒御,到底是詐尸還是另有隱情父叙,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布肴裙,位于F島的核電站趾唱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蜻懦。R本人自食惡果不足惜甜癞,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宛乃。 院中可真熱鬧悠咱,春花似錦蒸辆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至眼坏,卻和暖如春拂玻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宰译。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工檐蚜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沿侈。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓闯第,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肋坚。 傳聞我的和親對象是個殘疾皇子乡括,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容