python快速递归的方法_让你Python到很爽的加速递归函数的装饰器

今天我们会讲到一个[装饰器]

注记:链接“装饰器”指Python3教程中的装饰器教程。可以在这里快速了解什么是装饰器。

@functools.lru_cache——进行函数执行结果备忘,显著提升递归函数执行时间。

示例:寻找宝藏。在一个嵌套元组tuple或列表list中寻找元素'Gold Coin'

import time

from functools import lru_cache

def find_treasure(box):

for item in box:

if isinstance(item, (tuple, list)):

find_treasure(item)

elif item == 'Gold Coin':

print('Find the treasure!')

return True

start = 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 - start

print('在没有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 True

start = 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 - start

print('在有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 2600

RAM:Kingston HyperX 8Gigabytes 2666

约使用7个月。

这个装饰器可以在函数运行时记录它的输入值与运行结果。当元组('Bad Coin', 'normal coin', 'fish', 'sth', 'any sth')出现第二次时,加了这个装饰器的函数find_the_treasure_quickly不会再次在递归时对这个元组进行查找,而是直接在“备忘录”中找到运行结果并返回!

总结

以上所述是小编给大家介绍的让你Python到很爽的加速递归函数的装饰器,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值