问题描述

斐波那契数列的递推公式如下,在编程中最直接的实现方式是使用递归,如果能将每一步的计算结果缓存下来,那计算效率肯定更高

F(1)=1F(2)=1F(n)=F(n−1)+F(n−2),n≥3\begin{array}{l}F(1)=1\\F(2)=1\\F(n)=F(n-1)+F(n-2),\;n\geq3\end{array}F(1)=1F(2)=1F(n)=F(n−1)+F(n−2),n≥3​

解决方案

使用functools模块中的lru_cache(),使用最久未使用(LRU)缓存算法

PS:该算法在计算结果相同时有用,如time()random()之类的函数是没有用的

代码

from functools import lru_cache@lru_cache(maxsize=None)
def fib(n):if n < 2:return nreturn fib(n - 1) + fib(n - 2)def fib1(n):if n < 2:return nreturn fib1(n - 1) + fib1(n - 2)result = [fib(i) for i in range(16)]
print(result)
print(fib.cache_info())  # 查看命中和未命中次数
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
# CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)

对比

%%timeit
[fib(i) for i in range(16)]
# 2.26 µs ± 27.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
[fib1(i) for i in range(16)]
# 567 µs ± 4.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

计算n=16的斐波那契数列的情况下,快250倍。使用了缓存后,n=1000也能轻松计算出来。

参考文献

  1. functools — 高阶函数和可调用对象上的操作
  2. Python的Functools模块简介
  3. Introduction To Python’s Functools Module

Python缓存提高递归代码性能lru_cache相关推荐

  1. python linux 优化_Python 代码性能优化技巧

    Python 性能优化除了改进算法,选用合适的数据结构之外,还有几种关键的技术,比如将关键 python 代码部分重写成 C 扩展模块,或者选用在性能上更为优化的解释器等,这些在本文中统称为优化工具. ...

  2. 微信小程序利用缓存提高接口请求性能

    对于接口数据过多的接口可以使用缓存提升用户体验和性能,同时也可以防止用户重复请求过多次数 data: {leftMenuList:[],//左侧菜单数据rightContent:[],//右侧的商品数 ...

  3. python测试代码性能_使用python timeit 模块检测代码性能

    使用Python 通常在乎的是它的开发效率,而不是运行性能. 但如果通过很简单的方法可以测试出n种不同的写法之间的性能差异,这个过程本身也是一种乐趣. python 自带了timeit 模块,可以在代 ...

  4. 如何使用缓存提高程序性能

    1 写在前面 此文主要参考了园子里以下两篇文章: 黄聪,Microsoft Enterprise Library 5.0 系列(一) : Caching Application Block (初级) ...

  5. Python缓存lru_cache的介绍和讲解

    一.前言 我们经常谈论的缓存一词,更多的类似于将硬盘中的数据存放到内存中以至于提高读取速度,比如常说的redis,就经常用来做数据的缓存. Python的缓存(lru_cache)是一种装饰在被执行的 ...

  6. Python 缓存机制之functools.lru_cache

    说到缓存这个概念,我想大家应该都不陌生 ,以Redis和Memcache为代表的缓存应用基本成为了现在微服务架构的标配了. 事实上,并不是说要用缓存就必须部署Redis等服务,比如在以Python为开 ...

  7. java开发之提高java和mysql代码性能和质量

    0.if嵌套的层数最好不要超过3层 点击(此处)折叠或打开 import java.util.HashMap; import java.util.Map; public class Qiantao { ...

  8. python代码性能优化技巧

    python代码性能优化技巧 代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Pyth ...

  9. 提升Python代码性能的六个技巧

    文章目录 前言 为什么要写本文? 1.代码性能检测 1.1.使用 timeit 库 1.2.使用 memory_profiler 库 1.3.使用 line_profiler 库 2.使用内置函数和库 ...

最新文章

  1. linux写命令时方便的快捷键以及Vim必备命令
  2. 一篇文章带你搞懂JS对象的自我销毁
  3. 中国人工智能学会通讯——人工智能如何造福人类 1.1 人工智能是中性技术
  4. DL之Keras:keras保存网络结构、网络拓扑图、网络模型(json、yaml、h5等)注意事项及代码实现
  5. 转载 程序员上帝视角解读“旅行青蛙”,你的呱真的在旅行嘛? (手机游戏)...
  6. .net core 下使用StackExchange的Redis库访问超时解决
  7. 如何用java对接口发送请求_7. 用Java做接口测试1-发送HTTP请求和接收HTTP响应
  8. PyTorch:保存/加载训练好的模型测试
  9. 中小学计算机教育的重要性,信息技术在小学教育中重要性.doc
  10. iBeacon的第一篇(基于Swift实现)
  11. JDBC的使用(msql);
  12. 2022年CISP考试题库下载
  13. 提高睡眠质量的东西,每天晚上睡不着的你一定要试试
  14. html播放韰 寸 频,asp.net 汉字转换拼音及首字母实现代码
  15. matlab计算最大特征向量,MATLAB求最大特征值和特征向量
  16. win8/win10任务栏/语言栏跳动/闪烁
  17. 【bWAPP】XSS通关记录
  18. PR视频去水印—中间值
  19. 云计算机可以玩游戏吗,免费云桌面系统能跟云电脑一样玩游戏吗?
  20. php acs解密,RSA 加密及php实现

热门文章

  1. SomeProbles:关于Mac不能格式化新的wd硬盘问题
  2. Chrome网页翻译插件,实测超好用,万物皆可译
  3. 百度卫星地图无法使用鼠标绘制工具的问题简单解决方案
  4. ctf新手总结--web做题
  5. 学阿里中台,80%的人只学到了皮毛!揭秘阿里中台的12个架构思维和原则
  6. 02 ,概率论 :初级概念,极差,频率,直方图,曲线图
  7. ABP VNext学习日记21
  8. Java解析剑指Offer链表篇(1)
  9. 着急使用新西兰无犯罪文件怎么办理新西兰使馆认证呢
  10. H5中 JS 禁用安卓手机物理返回键 , 微信浏览器中也支持