让你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服务器端收发请求的实现代码
Sep 29 Python
Python编程中使用Pillow来处理图像的基础教程
Nov 20 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
Nov 22 Python
Python基于property实现类的特性操作示例
Jun 15 Python
Linux下python3.6.1环境配置教程
Sep 26 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
Dec 05 Python
实例讲解Python中整数的最大值输出
Mar 17 Python
python 中如何获取列表的索引
Jul 02 Python
Python考拉兹猜想输出序列代码实践
Jul 05 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
Python基于pip实现离线打包过程详解
May 15 Python
python中redis包操作数据库的教程
Apr 19 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 动态添加记录
2009/03/10 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
2014/06/30 PHP
php遍历删除整个目录及文件的方法
2015/03/13 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
2012/01/15 Javascript
jQuery取得select选择的文本与值的示例
2013/12/09 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
2014/08/06 Javascript
QQ登录背景闪动效果附效果演示源码下载
2015/09/22 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
2016/10/24 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
Bootstrap模态窗口源码解析
2017/02/08 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
jQuery ajax调用webservice注意事项
2017/10/08 jQuery
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
用Python实现一个简单的线程池
2015/04/07 Python
归纳整理Python中的控制流语句的知识点
2015/04/14 Python
神经网络python源码分享
2017/12/15 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
2020/08/07 Python
Python如何执行系统命令
2020/09/23 Python
python 解决Windows平台上路径有空格的问题
2020/11/10 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
HTML5 对各个标签的定义与规定:body的介绍
2012/06/21 HTML / CSS
PREMIUM-MALL法国:行李、箱包及配件在线
2019/05/30 全球购物
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
装潢设计专业推荐信模板
2013/11/26 职场文书
简短大学毕业感言
2014/01/18 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
单身证明格式样本
2015/06/15 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
Spring Cache和EhCache实现缓存管理方式
2021/06/15 Java/Android
详解CSS中的特指度和层叠问题
2021/07/15 HTML / CSS
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers