让你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安装以及IDE的配置教程
Apr 29 Python
Python实现的十进制小数与二进制小数相互转换功能
Oct 12 Python
python图书管理系统
Apr 05 Python
Python实现简单求解给定整数的质因数算法示例
Mar 25 Python
Python 绘图库 Matplotlib 入门教程
Apr 19 Python
python3 pandas 读取MySQL数据和插入的实例
Apr 20 Python
Python逐行读取文件中内容的简单方法
Feb 26 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
Jul 06 Python
python 默认参数相关知识详解
Sep 18 Python
Python concurrent.futures模块使用实例
Dec 24 Python
Python捕获异常堆栈信息的几种方法(小结)
May 18 Python
什么是Python变量作用域
Jun 03 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之生成GIF动画的实现方法
2013/06/07 PHP
destoon安全设置中需要设置可写权限的目录及文件
2014/06/21 PHP
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
JavaScript 学习笔记(七)字符串的连接
2009/12/31 Javascript
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
深入分析js中的constructor和prototype
2012/04/07 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
JS window对象简单操作完整示例
2020/01/14 Javascript
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
python中使用OpenCV进行人脸检测的例子
2014/04/18 Python
python操作xml文件详细介绍
2014/06/09 Python
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
带你了解python装饰器
2017/06/15 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
2017/07/06 Python
python随机数分布random测试
2018/08/27 Python
PyCharm代码提示忽略大小写设置方法
2018/10/28 Python
Python单元测试与测试用例简析
2019/11/09 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
python连接mysql有哪些方法
2020/06/24 Python
全面解析HTML5中的标准属性与自定义属性
2016/02/18 HTML / CSS
编辑找工作求职信分享
2014/01/03 职场文书
助学贷款贫困证明
2014/09/23 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
教代会开幕词
2015/01/28 职场文书
今日说法观后感
2015/06/08 职场文书
安全生产隐患排查制度
2015/08/05 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS