让你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 set集合类型操作总结
Nov 07 Python
基于wxpython开发的简单gui计算器实例
May 30 Python
浅谈Python数据类型判断及列表脚本操作
Nov 04 Python
Python子类继承父类构造函数详解
Feb 19 Python
运用Python的webbrowser实现定时打开特定网页
Feb 21 Python
使用Python实现毫秒级抢单功能
Jun 06 Python
Python Threading 线程/互斥锁/死锁/GIL锁
Jul 21 Python
python字符串分割及字符串的一些常规方法
Jul 24 Python
Django 删除upload_to文件的步骤
Mar 30 Python
Pytorch环境搭建与基本语法
Jun 03 Python
django 装饰器 检测登录状态操作
Jul 02 Python
基于Python编写一个监控CPU的应用系统
Jun 25 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
php递归实现无限分类生成下拉列表的函数
2010/08/08 PHP
PHP大批量数据操作时临时调整内存与执行时间的方法
2011/04/20 PHP
PHP实现服务器状态监控的方法
2014/12/09 PHP
php实现的mongodb操作类
2015/05/28 PHP
Symfony2开发之控制器用法实例分析
2016/02/05 PHP
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
2016/09/01 PHP
php判断是否连接上网络的方法实例详解
2016/12/14 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
2007/08/13 Javascript
js表数据排序 sort table data
2009/02/18 Javascript
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
2011/01/06 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
微信小程序商城项目之购物数量加减(3)
2017/04/17 Javascript
浅谈vue的踩坑路
2017/08/31 Javascript
vue-router 源码之实现一个简单的 vue-router
2018/07/02 Javascript
详解jquery和vue对比
2019/04/16 jQuery
Vue组件间数据传递的方式(3种)
2020/07/13 Javascript
python类装饰器用法实例
2015/06/04 Python
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
Python排序搜索基本算法之归并排序实例分析
2017/12/08 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
Python笔试面试题小结
2019/09/07 Python
Python基于stuck实现scoket文件传输
2020/04/02 Python
Python 实现RSA加解密文本文件
2020/12/30 Python
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
幼儿园国庆节活动方案
2014/02/01 职场文书
五水共治一句话承诺
2014/05/30 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
党建工作目标管理责任书
2015/01/29 职场文书
婚宴父母致辞
2015/07/27 职场文书
MySQL如何解决幻读问题
2021/08/07 MySQL
Java 定时任务技术趋势简介
2022/05/04 Java/Android