让你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 相关文章推荐
使用PyInstaller将Python程序文件转换为可执行程序文件
Jul 08 Python
python的unittest测试类代码实例
Dec 07 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
May 10 Python
在CMD命令行中运行python脚本的方法
May 12 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 Python
Python处理命令行参数模块optpars用法实例分析
May 31 Python
python使用pygame框架实现推箱子游戏
Nov 20 Python
pytorch 常用线性函数详解
Jan 15 Python
python logging 日志的级别调整方式
Feb 21 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 Python
Python自动化爬取天眼查数据的实现
Jun 15 Python
python创建字典及相关管理操作
Apr 13 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
php printf输出格式使用说明
2010/12/05 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
PHP仿微信发红包领红包效果
2016/10/30 PHP
javascript 单选框,多选框美化代码
2008/08/01 Javascript
js移除事件 js绑定事件实例应用
2012/11/28 Javascript
关于jQuery参考实例2.0 用jQuery选择元素
2013/04/07 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
2014/03/13 Javascript
JavaScript日期时间格式化函数分享
2014/05/05 Javascript
angularJS 中input示例分享
2015/02/09 Javascript
Js控制滑轮左右滑动实例
2015/02/13 Javascript
Vuejs 组件——props数据传递的实例代码
2017/03/07 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
js 图片转base64的方式(两种)
2018/04/24 Javascript
JS面向对象的程序设计相关知识小结
2018/05/26 Javascript
JS的函数调用栈stack size的计算方法
2018/06/24 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
Python实现文件复制删除
2016/04/19 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
2019/04/01 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
Python Des加密解密如何实现软件注册码机器码
2020/01/08 Python
Python通过文本和图片生成词云图
2020/05/21 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
2020/07/03 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
利用SVG和CSS3来实现一个炫酷的边框动画
2015/07/22 HTML / CSS
关于h5中的fetch方法解读(小结)
2017/11/15 HTML / CSS
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
日语翻译个人求职的自我评价
2013/10/14 职场文书
跟单文员的岗位职责
2013/11/14 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
财务部绩效考核方案
2014/05/04 职场文书
招标授权委托书样本
2014/09/23 职场文书
大班上学期个人总结
2015/02/13 职场文书
公安纪律作风整顿心得体会
2016/01/23 职场文书
纯CSS打字动画的实现示例
2022/08/05 HTML / CSS