让你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 with语句简介
Apr 11 Python
Python面向对象之类的定义与继承用法示例
Jan 14 Python
浅谈Python批处理文件夹中的txt文件
Mar 11 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
Jun 27 Python
pandas计算最大连续间隔的方法
Jul 04 Python
Python 分享10个PyCharm技巧
Jul 13 Python
Python搭建代理IP池实现接口设置与整体调度
Oct 27 Python
安装Pycharm2019以及配置anconda教程的方法步骤
Nov 11 Python
python剪切视频与合并视频的实现
Mar 03 Python
python 实现aes256加密
Nov 27 Python
通过python-pptx模块操作ppt文件的方法
Dec 26 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
Jan 28 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服务端图片生成缩略图的方法详解
2013/06/20 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
2014/06/05 PHP
PHP实现用户登录的案例代码
2018/05/10 PHP
js类型检查实现代码
2010/10/29 Javascript
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
javascript生成随机颜色示例代码
2014/05/05 Javascript
javascript几个易错点记录
2014/11/26 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
2019/06/03 Javascript
jQuery实现弹幕特效
2019/11/29 jQuery
从零开始在vue-cli4配置自适应vw布局的实现
2020/06/08 Javascript
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
python 编程之twisted详解及简单实例
2017/01/28 Python
python实现图片处理和特征提取详解
2017/11/13 Python
TensorFlow实现创建分类器
2018/02/06 Python
pandas DataFrame 数据选取,修改,切片的实现
2020/04/24 Python
Python如何读取、写入JSON数据
2020/07/28 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
Farnell德国:电子元器件供应商
2018/07/10 全球购物
违反工作规定检讨书范文
2014/12/14 职场文书
2016年元旦致辞
2015/08/01 职场文书
班干部学习委员竞选稿
2015/11/20 职场文书
2019个人工作总结
2019/06/21 职场文书
Html5同时支持多端sdk的小技巧
2021/11/17 HTML / CSS
Redis分布式锁的7种实现
2022/04/01 Redis
台式电脑蓝牙适配器怎么安装?台式电脑蓝牙适配器安装教程
2022/04/08 数码科技