让你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 sys模块sys.path使用方法示例
Dec 04 Python
pygame游戏之旅 添加游戏介绍
Nov 20 Python
Django渲染Markdown文章目录的方法示例
Jan 02 Python
Python功能点实现:函数级/代码块级计时器
Jan 02 Python
python禁用键鼠与提权代码实例
Aug 16 Python
python3 logging日志封装实例
Apr 08 Python
在tensorflow以及keras安装目录查询操作(windows下)
Jun 19 Python
Python如何操作docker redis过程解析
Aug 10 Python
python语言实现贪吃蛇游戏
Nov 13 Python
Python常用断言函数实例汇总
Nov 30 Python
python中子类与父类的关系基础知识点
Feb 02 Python
在Pycharm中安装Pandas库方法(简单易懂)
Feb 20 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中文件上传的安全问题
2006/10/09 PHP
深入Memcache的Session数据的多服务器共享详解
2013/06/13 PHP
浅析PHP 按位与或 (^ 、&)
2013/06/21 PHP
PHP与javascript实现变量交互的示例代码
2013/07/23 PHP
关于php中一些字符串总结
2016/05/05 PHP
PHP代码加密的方法总结
2020/03/13 PHP
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
2010/09/17 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
javascript时间函数大全
2014/06/30 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
2015/11/20 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
原生js实现打字动画游戏
2017/02/04 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
javascript实现点击星星小游戏
2019/12/24 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
Python批量转换文件编码格式
2015/05/17 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
英国家居用品和床上用品零售商:P&B Home
2020/01/16 全球购物
综合办公室主任职责
2013/12/16 职场文书
高中打架检讨书
2014/02/13 职场文书
四风问题对照检查材料
2014/09/22 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
《自己去吧》教学反思
2016/02/16 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP
为什么MySQL分页用limit会越来越慢
2021/07/25 MySQL
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏
Python数组变形的几种实现方法
2022/05/30 Python