时间:2021-05-22
今天我们会讲到一个[装饰器]
注记:链接“装饰器”指Python3教程中的装饰器教程。可以在这里快速了解什么是装饰器。
@functools.lru_cache——进行函数执行结果备忘,显著提升递归函数执行时间。
示例:寻找宝藏。在一个嵌套元组tuple或列表list中寻找元素'Gold Coin'
import timefrom functools import lru_cachedef find_treasure(box): for item in box: if isinstance(item, (tuple, list)): find_treasure(item) elif item == 'Gold Coin': print('Find the treasure!') return Truestart = time.perf_counter()find_treasure(('sth', 'sth', 'sth', ('Bad Coin', 'normal coin', 'fish', 'sth', 'any sth'), ('Bad Coin', 'normal coin', 'fish', 'sth', 'any sth'), 'Gold Coin', ))end = time.perf_counter()run_time_without_cache = end - startprint('在没有Cache的情况下,运行花费了{} s。'.format(run_time_without_cache))@lru_cache()def find_treasure_quickly(box): for item in box: if isinstance(item, (tuple, list)): find_treasure(item) elif item == 'Gold Coin': print('Find the treasure!') return Truestart = time.perf_counter()find_treasure_quickly(('sth', 'sth', 'sth', ('Bad Coin', 'normal coin', 'fish', 'sth', 'any sth'), ('Bad Coin', 'normal coin', 'fish', 'sth', 'any sth'), 'Gold Coin', ))end = time.perf_counter()run_time_with_cache = end - startprint('在有Cache的情况下,运行花费了{} s。'.format(run_time_with_cache))print('有Cache比没Cache快{} s。'.format(float(run_time_without_cache-run_time_with_cache)))最终输出
Find the treasure!
在没有Cache的情况下,运行花费了0.0002182829999810565 s。
Find the treasure!
在有Cache的情况下,运行花费了0.00011638000000857573 s。
有Cache比没Cache快0.00010190299997248076 s。
注记:运行这个示例时我的电脑配置如下
CPU:AMD Ryzen 5 2600RAM:Kingston HyperX 8Gigabytes 2666约使用7个月。
这个装饰器可以在函数运行时记录它的输入值与运行结果。当元组('Bad Coin', 'normal coin', 'fish', 'sth', 'any sth')出现第二次时,加了这个装饰器的函数find_the_treasure_quickly不会再次在递归时对这个元组进行查找,而是直接在“备忘录”中找到运行结果并返回!
总结
以上所述是小编给大家介绍的让你Python到很爽的加速递归函数的装饰器,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义。一、函数式装饰器:装饰器本身是一个函数。1.装饰函数:被装饰对象是一个函数[1]装饰
本文实例讲述了Python装饰器原理与用法。分享给大家供大家参考,具体如下:1、装饰器的本质是函数,主要用来装饰其他函数,也就是为其他函数添加附加功能2、装饰器
关于@property装饰器在Python中我们使用@property装饰器来把对函数的调用伪装成对属性的访问。那么为什么要这样做呢?因为@property让我
Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的funct
最近学到了一个有趣的装饰器写法,就记录一下。装饰器是一个返回函数的函数。写一个装饰器,除了最常见的在函数中定义函数以外,Python还允许使用类来定义一个装饰器