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