裝飾器的一個使用場景
之前有人問裝飾器有什麼用,能不能具體說個場景。當時,沒想好如何使用這個問題。昨天看github上有一個純python實現的有序數據結構庫-SortedContainer。說的很牛B,很想用一下。
SortedContainer庫中的數據結構,如列表、字典、集合等使用方法跟python的list、dict、set類似。基本上不用怎麼學,稍微看下就能會。
我們這裏只想簡單對比下在列表中查找某個元素的位置(index)的效率。
如何測試運行效率
這裏我使用裝飾器,一次寫完,多次使用。而且很簡潔。
def runtime(func):
def inner(**kwargs):
import time
t1 = time.time()
func(**kwargs)
t2 = time.time()
run_time = t2 - t1
print(run_time)
return inner
還記得不,裝飾器其實就是一種函數。
func是我們要裝飾的函數,那麼我們必須在 func之外加點料,在裝飾器中 加的料就是 inner部分,inner部分對func函數運行前後加了時間戳,用來計算運行時間。
裝飾器 runtime結尾要返回inner這個實例。注意,返回的不是inner(),今天我栽在這裏費了十幾分鍾。
list vs SortedList
現在開始測試檢索位置的運行效率。比如我要對有10000個數的列表進行查詢,查找1234這個數的位置。
這還用查嗎?位置肯定是1234。但是在計算機中,位置檢索那可是得暴力推進。一個個的查,查到了就返回這個位置。
直接上代碼,大家看看list與SortList
#這裏我們默認位置檢索執行times次,列表長度length,檢索的元素是數字num
@runtime
def list_index(times=10000,length=10000,num=1234):
for x in range(times):
#將range轉化爲list列表
container = list(range(length))
container.index(num)
@runtime
def Sortlist_index(times=10000,length=10000,num=1234):
for x in range(times):
#將range轉化爲SortedList列表
container = SortedList(range(length))
container.index(num)
list_index()
Sortlist_index()
程序重複10000次,時間爲
2.4893643856048584
5.546206951141357
從這方面,還是python內置的list效率高。SortedContainer從名字也看出來了,它的各種數據結構更適合用在有序的數據結構。
Tips
SortedContainer簡介
Python’s standard library is great until you need a sorted collections
type. Many will attest that you can get really far without one, but the
moment you really need a sorted list, dict, or set, you’re faced with
a dozen different implementations, most using C-extensions without
great documentation and benchmarking.
譯文:
在您需要排序的集合類型前,Python的標準庫都是很棒。許多事情表明,你不可能只用一種玩意
就能走的很遠,但是當你真正需要排序列表,字典或者集合的時,你能找到十幾個不同的實現,
但大多數使用C-extensions而且沒有很好的文檔說明。
在本文中,目的是看看裝飾器的使用場景--測試運行時間--並不是說SortedContainer的運行效率問題。哈哈,以後大家寫起代碼真有排序這需求,知道有這麼一個庫可以方便快速找到並去查文檔。