Python通過裝飾器并使用cprofile對函數(shù)進行性能分析

進行分析的輔助類

Python中提供了很多接口方便我們能夠靈活進行性能分析室囊,包括cProfile模塊中的Profile類和pstat模塊中的Stats類。

cprofile簡介

--cprofile是一種確定性分析器瘟栖,只測量CPU時間,并不關心內(nèi)存的消耗情況和其他與內(nèi)存相關聯(lián)的信息

--它是基于Isprof的用C語言實現(xiàn)的擴展應用,運行開銷比較合理爷耀,適合分析運行時間較長的程序

Profile類:

--enable(): 開始進行性能分析并收集數(shù)據(jù)

--disableI(): 停止性能分析

--create_stats(): 停止收集數(shù)據(jù),并為已經(jīng)收集的數(shù)據(jù)創(chuàng)建stats對象

--print_stats():創(chuàng)建stats對象并打印分析結(jié)果

--dump_stats(filename): 把當前性能分析的內(nèi)容寫入文件filename中

--runcall(func, *args, **kwargs): 收集被調(diào)用函數(shù)func的性能分析信息

pstats簡介

--用來分析cProfile輸出的文件內(nèi)容

--pstas模塊為開發(fā)者提供了Stats類拍皮,可以讀取和操作stats文件

Stats類:

(Stats類可以接受stats文件名歹叮,也可以直接接受cProfile.Profile對象作為數(shù)據(jù)源。)

--strip_dirs(): 刪除報告中所有函數(shù)文件名的路徑信息

--dump_stats(filename): 把stats中的分析數(shù)據(jù)寫入文件(也可以寫成cProfile.Profile.dump_stats())

--sort_stats(*keys): 對報告列表進行排序铆帽,函數(shù)會一次按照傳入的參數(shù)排序

--reverse_order(): 逆反當前的排序

--print_stats(*restrictions): 把信息打印到標準輸出咆耿。*restrictions用于控制打印結(jié)果的形式,比如(10,1.0爹橱,".*.py.*")表示打印所有py文件的信息的前10行結(jié)果

進行排序的key值

打印數(shù)據(jù)的解讀:

這是得到的一個結(jié)果

--第一行表示運行這個函數(shù)一共使用0.043秒萨螺,執(zhí)行了845次函數(shù)調(diào)用

--第二行表示結(jié)果是按什么順序排列的(這里表示按照調(diào)用次數(shù)來進行排列的)

--ncalls: 表示函數(shù)調(diào)用的次數(shù)(有兩個數(shù)值表示有遞歸調(diào)用,總調(diào)用次數(shù)/原生調(diào)用次數(shù))

--tottime: 函數(shù)內(nèi)部調(diào)用時間(不包括他自己調(diào)用的其他函數(shù)時間)

? ? eg:funA():?

? ? ? ? ? ? ? ? funB() 得到tottime = funA()執(zhí)行的時間-funB()執(zhí)行的時間

--percall: tottime/ncalls

--cumtime: 表示累計調(diào)用時間(函數(shù)執(zhí)行玩的總時間),它包含了函數(shù)自己內(nèi)部調(diào)用的函數(shù)時間

--filename:lineno(function): 函數(shù)所在的文件屑迂,行號浸策,函數(shù)名稱

一個例子,使用裝飾器對一個函數(shù)進行分析

import cProfile

import pstats

import functools

def do_cProfile(do=False, order='tottime'):

????????def wrapper(func):

????????????????@functools.wraps(func)

????????????????def profiled_func(*args, **kwargs):

????????????????if do:

????????????????????profile = cProfile.Profile()

????????????????????profile.enable()

????????????????????result = func(*args, **kwargs)

????????????????????profile.disable()

????????????????????#profile.print_stats()

? ? ? ? ? ? ????????ps = pstats.Stats(profile).sort_stats(order).strip_dirs()

????????????????????ps.print_stats()

????????????????else:

????????????????result = func(*args, **kwargs)

????????????????return result

????????return profiled_func

return wrapper

上面的函數(shù)do_cProfile(do=False, order='tottime')是一個帶參數(shù)的裝飾器惹盼,通過do的值來進行性能分析的開關控制庸汗,通過order的值來選擇輸出結(jié)果按照什么方式進行排序。

比如我們對函數(shù)A和函數(shù)B進行性能分析

from profile_decorator import do_cProfile

@do_cProfile(True)

def funA():...

@do_cProfile(True, calls)

def funB():...

如果不給裝飾器傳入?yún)?shù)的話就是默認的False和tottime

參考連接:

https://zhuanlan.zhihu.com/p/24495603

https://blog.csdn.net/weixin_40304570/article/details/79459811

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末手报,一起剝皮案震驚了整個濱河市蚯舱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掩蛤,老刑警劉巖枉昏,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揍鸟,居然都是意外死亡兄裂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門阳藻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晰奖,“玉大人,你說我怎么就攤上這事腥泥∝夷希” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵蛔外,是天一觀的道長蛆楞。 經(jīng)常有香客問我,道長夹厌,這世上最難降的妖魔是什么豹爹? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮尊流,結(jié)果婚禮上帅戒,老公的妹妹穿的比我還像新娘灯帮。我一直安慰自己崖技,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布钟哥。 她就那樣靜靜地躺著迎献,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腻贰。 梳的紋絲不亂的頭發(fā)上吁恍,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音,去河邊找鬼冀瓦。 笑死伴奥,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的翼闽。 我是一名探鬼主播拾徙,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼感局!你這毒婦竟也來了尼啡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤询微,失蹤者是張志新(化名)和其女友劉穎崖瞭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撑毛,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡书聚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了藻雌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寺惫。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蹦疑,靈堂內(nèi)的尸體忽然破棺而出西雀,到底是詐尸還是另有隱情,我是刑警寧澤歉摧,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布艇肴,位于F島的核電站,受9級特大地震影響叁温,放射性物質(zhì)發(fā)生泄漏再悼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一膝但、第九天 我趴在偏房一處隱蔽的房頂上張望冲九。 院中可真熱鬧,春花似錦跟束、人聲如沸莺奸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灭贷。三九已至,卻和暖如春略贮,著一層夾襖步出監(jiān)牢的瞬間甚疟,已是汗流浹背仗岖。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留览妖,地道東北人轧拄。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像讽膏,于是被迫代替她去往敵國和親紧帕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

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

  • Python語言特性 1 Python的函數(shù)參數(shù)傳遞 看兩個如下例子桅打,分析運行結(jié)果: 代碼一: a = 1 def...
    伊森H閱讀 3,069評論 0 15
  • Python語言特性 1 Python的函數(shù)參數(shù)傳遞 看兩個如下例子是嗜,分析運行結(jié)果: 代碼一: a = 1 def...
    時光清淺03閱讀 493評論 0 0
  • 寫在前面的話 代碼中的# > 表示的是輸出結(jié)果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 2,771評論 0 8
  • 引言 想找一份Python開發(fā)工作嗎?那你很可能得證明自己知道如何使用Python挺尾。下面這些問題涉及了與Pytho...
    VanessaC閱讀 738評論 0 0
  • “誠是實理鹅搪,只是一個良知。實理之妙用流行就是神遭铺,其萌動處就是幾丽柿。詼神幾曰圣人。圣人不貴前知魂挂;禍福之來甫题,雖圣人有所不...
    巴山夜雨DIY閱讀 725評論 0 0