python 中如何快速查看代碼的性能 DebugInfo 秒表裝飾器

背景

我們在 python 編程時兄渺,在有性能優(yōu)化需求的場景下侵浸,我們可能一個需求存在多個解決方案的情況喝噪,這些解決方案可能在不同的 模塊/庫 中實(shí)現(xiàn)础嫡。

那么對于可以實(shí)現(xiàn)兩樣的功能,但實(shí)現(xiàn)方式不同的情況下酝惧,我們直接測試一下每個方式的運(yùn)行性能榴鼎,是最直觀評估不同的實(shí)現(xiàn)方案性能的辦法。

一般解決方法

于是就有了對需求實(shí)現(xiàn)方案運(yùn)行時間進(jìn)行計算的需求晚唇。如下的代碼中巫财,【方法1】和【方法2】 實(shí)現(xiàn)同樣的結(jié)果。實(shí)現(xiàn)邏輯略有不同哩陕。

# -*- coding:UTF-8 -*-

def 方法1():
    最終結(jié)果 = 0
    for 次數(shù) in range(1000000000):
        最終結(jié)果 = 次數(shù)
    return 最終結(jié)果


def 方法2():
    最終結(jié)果: int
    for 最終結(jié)果 in range(1000000000):
        pass

    return 最終結(jié)果


if __name__ == '__main__':

    開始時間 = time.time()
    print(方法1())
    結(jié)束時間 = time.time()
    print('方法 1 執(zhí)行了 {}s'.format(結(jié)束時間 - 開始時間))

    開始時間 = time.time()
    print(方法2())
    結(jié)束時間 = time.time()
    print('方法 2 執(zhí)行了 {}s'.format(結(jié)束時間 - 開始時間))

在以上代碼中平项,為了測試【方法1】和【方法2】的性能,使用了 time.time() 函數(shù)分別計算了兩個方法執(zhí)行開始和結(jié)的時間戳悍及,然后做減法計算其運(yùn)行時間闽瓢。代碼的打印效果如下:

使用time.time 對代碼運(yùn)行時間進(jìn)行計時

事實(shí)上,這種計算某一個方法的執(zhí)行時間的需求心赶,往往都是臨時性的需求扣讼。這種需要記錄方法執(zhí)行前后時間,再做減法計算時間差的做法缨叫,反而顯得有些繁瑣椭符。

DebugInfo 秒表裝飾器

DebugInfo 模塊中,有一個秒表裝飾器弯汰,可以非常方便的對我們需要觀察性能的方法進(jìn)行裝飾。以下演示其用法湖雹。

pip install DebugInfo

修改上文的測試代碼咏闪,使用 秒表對【方法1】和【方法2】進(jìn)行裝飾。如下:

# -*- coding:UTF-8 -*-

# region 引入調(diào)試模塊
import os

try:
    from DebugInfo.DebugInfo import *
except ImportError as impErr:
    print('嘗試引入 DebugInfo 模塊時出現(xiàn)異常:', impErr)
    os.system('pip install DebugInfo')
    try:
        from DebugInfo.DebugInfo import *
    except ImportError as e:
        print('嘗試引入 DebugInfo 模塊時再次出現(xiàn)異常:', impErr)
        exit(0)

# endregion


@秒表
def 方法1():
    最終結(jié)果 = 0
    for 次數(shù) in range(1000000000):
        最終結(jié)果 = 次數(shù)
    return 最終結(jié)果


@秒表
def 方法2():
    最終結(jié)果: int
    for 最終結(jié)果 in range(1000000000):
        pass

    return 最終結(jié)果


if __name__ == '__main__':
    方法1()
    方法2()

以上代碼引入了 DebugInfo 模塊摔吏,使用其中的 秒表 裝飾器裝飾了【方法1】和【方法2】鸽嫂,在主程序中正常的調(diào)用【方法1】和【方法2】,秒表裝飾器即可以打印被裝飾的方法的運(yùn)行時間信息征讲,清晰明了据某,效果如下:

使用秒表裝飾器測試代碼運(yùn)行時間

我們觀察到,秒表裝飾器詳細(xì)的記錄并打印了兩個方法的執(zhí)行時間信息诗箍,其中包括了以下內(nèi)容:

  • 被測試的方法的名稱
  • 法開始執(zhí)行的時間
  • time.time 記錄的執(zhí)行時間
  • time.perf_counter 記錄的執(zhí)行時間
  • time.process_time 記錄的執(zhí)行時間

裝飾器可以非常方便的取消癣籽,例如以上代碼中,我們通過觀察發(fā)現(xiàn)【方法1】用時要比【方法2】長,說明【方法2】執(zhí)行效率要比【方法1】高筷狼。從而我們保留【方法2】瓶籽,取消 秒表 裝飾,即可恢復(fù)正常程序邏輯埂材。

智能計時單位

秒表裝飾器對于極簡單的代碼邏輯方法塑顺,也是支持計時的,例如下面的方法只循環(huán)一次俏险。

# -*- coding:UTF-8 -*-

@秒表
def 方法1():
    最終結(jié)果 = 0
    for 次數(shù) in range(1):
        最終結(jié)果 = 次數(shù)
    return 最終結(jié)果


@秒表
def 方法2():
    最終結(jié)果: int
    for 最終結(jié)果 in range(1):
        pass

    return 最終結(jié)果

秒表裝飾器的效果如下严拒, 我們可以看到秒表計時的單位自動切換為了? us


使用秒表裝飾器智能調(diào)整計時單位效果

小結(jié)

以上就是給大家分享的 DebugInfo 模塊中的一個 秒表 裝飾器的用法,可以協(xié)助優(yōu)化具體的算法性能竖独。

Pyinstrument

如果大家需要總體審查代碼的性能瓶徑裤唠,Pyinstrument 是更合適的工具哈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末预鬓,一起剝皮案震驚了整個濱河市巧骚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌格二,老刑警劉巖劈彪,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異顶猜,居然都是意外死亡沧奴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進(jìn)店門长窄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滔吠,“玉大人,你說我怎么就攤上這事挠日〈粒” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵嚣潜,是天一觀的道長冬骚。 經(jīng)常有香客問我,道長懂算,這世上最難降的妖魔是什么只冻? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮计技,結(jié)果婚禮上喜德,老公的妹妹穿的比我還像新娘。我一直安慰自己垮媒,他們只是感情好舍悯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布航棱。 她就那樣靜靜地躺著,像睡著了一般贱呐。 火紅的嫁衣襯著肌膚如雪丧诺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天奄薇,我揣著相機(jī)與錄音驳阎,去河邊找鬼。 笑死馁蒂,一個胖子當(dāng)著我的面吹牛呵晚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沫屡,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼饵隙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沮脖?” 一聲冷哼從身側(cè)響起金矛,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎勺届,沒想到半個月后驶俊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡免姿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年饼酿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胚膊。...
    茶點(diǎn)故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡故俐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出紊婉,到底是詐尸還是另有隱情药版,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布喻犁,位于F島的核電站槽片,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏株汉。R本人自食惡果不足惜筐乳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一歌殃、第九天 我趴在偏房一處隱蔽的房頂上張望乔妈。 院中可真熱鬧,春花似錦氓皱、人聲如沸路召。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽股淡。三九已至身隐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唯灵,已是汗流浹背贾铝。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留埠帕,地道東北人垢揩。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像敛瓷,于是被迫代替她去往敵國和親叁巨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評論 2 349

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