让你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解析nginx日志文件
May 11 Python
Python学习笔记之if语句的使用示例
Oct 23 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
Feb 18 Python
django 删除数据库表后重新同步的方法
May 27 Python
django小技巧之html模板中调用对象属性或对象的方法
Nov 30 Python
利用Python绘制Jazz网络图的例子
Nov 21 Python
python带参数打包exe及调用方式
Dec 21 Python
django之从html页面表单获取输入的数据实例
Mar 16 Python
Python远程方法调用实现过程解析
Jul 28 Python
python 用opencv实现图像修复和图像金字塔
Nov 27 Python
python 实现体质指数BMI计算
May 26 Python
Python音乐爬虫完美绕过反爬
Aug 30 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
dedecms模板标签代码官方参考
2007/03/17 PHP
PHP Zip压缩 在线对文件进行压缩的函数
2010/05/26 PHP
php微信浏览器分享设置以及回调详解
2016/08/01 PHP
如何在PHP中生成随机数
2020/06/04 PHP
js类的静态属性和实例属性的理解
2009/10/01 Javascript
IE图片缓存document.execCommand("BackgroundImageCache",false,true)
2011/03/01 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
js实现大转盘抽奖游戏实例
2015/06/24 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
谈谈第三方App接入微信登录 解读
2016/12/27 Javascript
学好js,这些js函数概念一定要知道【推荐】
2017/01/19 Javascript
js下载文件并修改文件名
2017/05/08 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
CentOS环境中MySQL修改root密码方法
2018/01/07 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
Vue瀑布流插件的使用示例
2018/09/19 Javascript
laydate如何根据开始时间或者结束时间限制范围
2018/11/15 Javascript
uni-app之APP和小程序微信授权方法
2019/05/09 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
小程序开发之模态框组件封装
2020/04/23 Javascript
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
python 发送json数据操作实例分析
2019/10/15 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
2020/04/08 Python
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
美国购买韩国护肤和美容产品网站:Althea Korea
2020/11/16 全球购物
公司贷款承诺书
2014/05/30 职场文书
四查四看自我剖析材料
2014/09/19 职场文书
国土资源局开展党的群众路线教育实践活动整改措施
2014/09/26 职场文书
2014年营销工作总结
2014/11/22 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
廉政承诺书
2015/01/19 职场文书
考研导师推荐信范文
2015/03/27 职场文书
SQL Server远程连接的设置步骤(图文)
2022/03/23 SQL Server
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript