让你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 相关文章推荐
Django1.3添加app提示模块不存在的解决方法
Aug 26 Python
使用Python抓取模板之家的CSS模板
Mar 16 Python
python实现基于两张图片生成圆角图标效果的方法
Mar 26 Python
解析Python中的变量、引用、拷贝和作用域的问题
Apr 07 Python
Python基于xlrd模块操作Excel的方法示例
Jun 21 Python
值得收藏,Python 开发中的高级技巧
Nov 23 Python
对pyqt5之menu和action的使用详解
Jun 20 Python
Python read函数按字节(字符)读取文件的实现
Jul 03 Python
python科学计算之narray对象用法
Nov 25 Python
Python语法之精妙的十个知识点(装B语法)
Jan 18 Python
Python新手学习装饰器
Jun 04 Python
Python 发送SMTP邮件的简单教程
Jun 24 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
《雄兵连》《烈阳天道》真的来了
2020/07/13 国漫
PHP cdata 处理(详细介绍)
2013/07/05 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
PDO操作MySQL的基础教程(推荐)
2017/08/18 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
一起来写段JS drag拖动代码
2010/12/09 Javascript
基于jquery的图片的切换(以数字的形式)
2011/02/14 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
JS代码防止SQL注入的方法(超简单)
2016/04/12 Javascript
JS 日期与时间戮相互转化的简单实例
2016/06/22 Javascript
js中获取jsp表单中radio类型的值简单实例
2016/08/15 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
浅谈Node Inspector 代理实现
2017/10/19 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
浅谈vue权限管理实现及流程
2020/04/23 Javascript
python读写csv文件方法详细总结
2019/07/05 Python
Python Pandas 如何shuffle(打乱)数据
2019/07/30 Python
Python 中list ,set,dict的大规模查找效率对比详解
2019/10/11 Python
使用python实现kNN分类算法
2019/10/16 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
django中related_name的用法说明
2020/05/20 Python
分享一个python的aes加密代码
2020/12/22 Python
python 实现客户端与服务端的通信
2020/12/23 Python
彼得罗夫美国官网:Peter Thomas Roth美国(青瓜面膜)
2017/11/05 全球购物
英国工艺品购物网站:Minerva Crafts
2018/01/29 全球购物
辞职信标准格式
2015/02/27 职场文书
学校实习推荐信
2015/03/27 职场文书
2015年禁毒工作总结
2015/04/30 职场文书
pytorch finetuning 自己的图片进行训练操作
2021/06/05 Python
JAVA springCloud项目搭建流程
2022/05/11 Java/Android