计算运行时间-装饰器实现

装饰器的一个使用场景
之前有人问装饰器有什么用,能不能具体说个场景。当时,没想好如何使用这个问题。昨天看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的运行效率问题。哈哈,以后大家写起代码真有排序这需求,知道有这么一个库可以方便快速找到并去查文档。

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