查看原文
其他

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

2017-06-15 大邓 大邓带你玩python

装饰器的一个使用场景

之前有人问装饰器有什么用,能不能具体说个场景。当时,没想好如何使用这个问题。昨天看github上有一个纯python实现的有序数据结构库-SortedContainer。说的很牛B,很想用一下。

SortedContainer库中的数据结构,如列表、字典、集合等使用方法跟python的list、dict、set类似。基本上不用怎么学,稍微看下就能会。

我们这里只想简单对比下在列表中查找某个元素的位置(index)的效率。

如何测试运行效率

这里我使用装饰器,一次写完,多次使用。而且很简洁。

  1. def runtime(func):

  2.    def inner(**kwargs):

  3.        import time

  4.        t1 = time.time()

  5.        func(**kwargs)

  6.        t2 = time.time()

  7.        run_time = t2 - t1

  8.        print(run_time)

  9.    return inner

还记得不,装饰器其实就是一种函数。

func是我们要装饰的函数,那么我们必须在 func之外加点料,在装饰器中 加的料就是 inner部分,inner部分对func函数运行前后加了时间戳,用来计算运行时间。

装饰器 runtime结尾要返回inner这个实例。注意,返回的不是inner(),今天我栽在这里费了十几分钟。

list vs SortedList

现在开始测试检索位置的运行效率。比如我要对有10000个数的列表进行查询,查找1234这个数的位置。

这还用查吗?位置肯定是1234。但是在计算机中,位置检索那可是得暴力推进。一个个的查,查到了就返回这个位置。

直接上代码,大家看看list与SortList

  1. #这里我们默认位置检索执行times次,列表长度length,检索的元素是数字num

  2. @runtime

  3. def list_index(times=10000,length=10000,num=1234):

  4.    for x in range(times):

  5.        #将range转化为list列表

  6.        container = list(range(length))

  7.        container.index(num)

  8. @runtime

  9. def Sortlist_index(times=10000,length=10000,num=1234):

  10.    for x in range(times):

  11.        #将range转化为SortedList列表

  12.        container = SortedList(range(length))

  13.        container.index(num)

  14. list_index()

  15. Sortlist_index()

程序重复10000次,时间为

  1. 2.4893643856048584

  2. 5.546206951141357

从这方面,还是python内置的list效率高。SortedContainer从名字也看出来了,它的各种数据结构更适合用在有序的数据结构。

Tips

  1. SortedContainer简介

  2. Pythons standard library is great until you need a sorted collections

  3. type. Many will attest that you can get really far without one, but the

  4. moment you really need a sorted list, dict, or set, youre faced with

  5. a dozen different implementations, most using C-extensions without

  6. great documentation and benchmarking.

  7. 译文:

  8. 在您需要排序的集合类型前,Python的标准库都是很棒。许多事情表明,你不可能只用一种玩意

  9. 就能走的很远,但是当你真正需要排序列表,字典或者集合的时,你能找到十几个不同的实现,

  10. 但大多数使用C-extensions而且没有很好的文档说明。

在本文中,目的是看看装饰器的使用场景--测试运行时间--并不是说SortedContainer的运行效率问题。哈哈,以后大家写起代码真有排序这需求,知道有这么一个库可以方便快速找到并去查文档。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存