让你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实现哈希表
Feb 07 Python
Python实现检测服务器是否可以ping通的2种方法
Jan 01 Python
Python实现从log日志中提取ip的方法【正则提取】
Mar 31 Python
完美解决python中ndarray 默认用科学计数法显示的问题
Jul 14 Python
python 自动去除空行的实例
Jul 24 Python
Python函数any()和all()的用法及区别介绍
Sep 14 Python
使用 Python 实现微信群友统计器的思路详解
Sep 26 Python
python批量修改图片后缀的方法(png到jpg)
Oct 25 Python
对pytorch网络层结构的数组化详解
Dec 08 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
Mar 30 Python
关于Python中定制类的比较运算实例
Dec 19 Python
图文详解matlab原始处理图像几何变换
Jul 09 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+mysql实现数据库随机重排实例
2014/10/17 PHP
PHP自动识别当前使用移动终端
2018/05/21 PHP
laravel配置Redis多个库的实现方法
2019/04/10 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
2020/04/26 PHP
javascript addBookmark 加入收藏 多浏览器兼容
2009/08/15 Javascript
jQuery之选项卡的简单实现
2014/02/28 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
jQuery实现元素的插入
2017/02/27 Javascript
微信小程序本地缓存数据增删改查实例详解
2017/05/24 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
用jQuery实现抽奖程序
2020/04/12 jQuery
vue实现PC端分辨率适配操作
2020/08/03 Javascript
vue实现点击按钮“查看详情”弹窗展示详情列表操作
2020/09/09 Javascript
[03:47]2015国际邀请赛第三日现场精彩回顾
2015/08/08 DOTA
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
Django接受前端数据的几种方法总结
2016/11/04 Python
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
使用selenium和pyquery爬取京东商品列表过程解析
2019/08/15 Python
python 导入数据及作图的实现
2019/12/03 Python
Python Socket多线程并发原理及实现
2020/12/11 Python
HTML5是什么 HTML5是什么意思 HTML5简介
2012/10/26 HTML / CSS
Joie官方网上商店:购买服装和女装配饰
2018/06/05 全球购物
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
澳大利亚买卖正宗二手奢侈品交易平台:Luxe.It.Fwd
2019/10/16 全球购物
《月球之谜》教学反思
2014/04/10 职场文书
同居协议书范本
2014/04/23 职场文书
投资意向书
2014/07/30 职场文书
煤矿安全协议书
2014/08/20 职场文书
安装工程师岗位职责
2015/02/13 职场文书
经费申请报告
2015/05/15 职场文书
张思德观后感
2015/06/09 职场文书