让你Python到很爽的加速递归函数的装饰器


Posted in Python onMay 26, 2019

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

注记:链接“装饰器”指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到很爽的加速递归函数的装饰器,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python实现的几个常用排序算法实例
Jun 16 Python
Python内置函数dir详解
Apr 14 Python
python使用paramiko实现远程拷贝文件的方法
Apr 18 Python
PyQt5每天必学之QSplitter实现窗口分隔
Apr 19 Python
Python处理CSV与List的转换方法
Apr 19 Python
使用Django启动命令行及执行脚本的方法
May 29 Python
springboot配置文件抽离 git管理统 配置中心详解
Sep 02 Python
python调用函数、类和文件操作简单实例总结
Nov 29 Python
浅谈Tensorflow 动态双向RNN的输出问题
Jan 20 Python
Python学习笔记之装饰器
Aug 06 Python
解决阿里云邮件发送不能使用25端口问题
Aug 07 Python
python基于socket模拟实现ssh远程执行命令
Dec 05 Python
Django框架模板的使用方法示例
May 25 #Python
Django框架搭建的简易图书信息网站案例
May 25 #Python
Django框架实现的分页demo示例
May 25 #Python
Flask框架工厂函数用法实例分析
May 25 #Python
Python中Numpy mat的使用详解
May 24 #Python
Python中Numpy ndarray的使用详解
May 24 #Python
numpy数组之存取文件的实现示例
May 24 #Python
You might like
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
最准确的php截取字符串长度函数
2015/10/29 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
2020/01/23 PHP
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
js+xml生成级联下拉框代码
2012/07/24 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
一个Action如何调用两个不同的方法
2014/05/22 Javascript
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
JavaScript模拟实现继承的方法
2015/03/30 Javascript
JS动态修改iframe内嵌网页地址的方法
2015/04/01 Javascript
html+javascript+bootstrap实现层级多选框全层全选和多选功能
2017/03/09 Javascript
react-native fetch的具体使用方法
2017/11/01 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
Vue实现随机验证码功能
2020/12/29 Vue.js
[41:17]VG vs Optic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
深入讲解Python编程中的字符串
2015/10/14 Python
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
Python中import机制详解
2017/11/14 Python
Python定义二叉树及4种遍历方法实例详解
2018/07/05 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
pytorch 求网络模型参数实例
2019/12/30 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
Python文件操作及内置函数flush原理解析
2020/10/13 Python
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
网络工程专业自荐信范文
2014/03/16 职场文书
教育基金募捐倡议书
2014/05/14 职场文书
森林防火标语
2014/06/23 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
幼儿园新生开学寄语
2015/05/27 职场文书
三十年同学聚会致辞
2015/07/28 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
python中的class_static的@classmethod的巧妙用法
2021/06/22 Python