計算運行時間-裝飾器實現

裝飾器的一個使用場景
之前有人問裝飾器有什麼用,能不能具體說個場景。當時,沒想好如何使用這個問題。昨天看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的運行效率問題。哈哈,以後大家寫起代碼真有排序這需求,知道有這麼一個庫可以方便快速找到並去查文檔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章