背景
我們在 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)行時間闽瓢。代碼的打印效果如下:
事實(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)行時間信息征讲,清晰明了据某,效果如下:
我們觀察到,秒表裝飾器詳細(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
小結(jié)
以上就是給大家分享的 DebugInfo 模塊中的一個 秒表 裝飾器的用法,可以協(xié)助優(yōu)化具體的算法性能竖独。
Pyinstrument
如果大家需要總體審查代碼的性能瓶徑裤唠,Pyinstrument 是更合適的工具哈。