方法

  • @functools.lru_cache(maxsize=128, typed=False)

源代码: Lib / functools.py

未完…


该模块用于高阶函数:作用于或返回其他函数的函数。通常,任何可调用对象都可以被视为用于此模块的函数。

@functools.lru_cache(maxsize=128, typed=False)

译者注:这里有一个简单的 例子

用一个memoizing callable来包装一个函数,它可以为最近的调用节省maxsize空间。当使用相同的参数定期调用或绑定昂贵的I/O函数时,它可以节省时间。

由于字典用于缓存结果,因此函数的位置和关键字参数必须是可哈希的。

不同的参数模式可以被认为是具有单独的高速缓存条目的不同调用。例如,f(a=1, b=2)f(b=2, a=1)的关键字参数顺序不同,并且可能有两个单独的缓存条目。

如果将maxsize=None,则禁用LRU(最近最少使用)功能,并且缓存可以无限制地增长。当maxsize是2的幂时,LRU功能表现最佳。

如果typed=True,则将分别缓存不同类型的函数参数。例如,f(3)f(3.0)将被视为产生截然不同的结果不同的调用。

为了帮助测量缓存的有效性并调整maxsize 参数,包装函数使用一个cache_info() 函数进行检测,该函数返回一个命名元组,显示hits,misses, maxsize,currsize。在多线程环境中,hitsmisses是近似值。

装饰器还提供cache_clear()功能用来清除或使缓存无效的。

可以通过__wrapped__属性访问原始基础函数 。这对于内省,绕过缓存或使用不同的缓存重新包装函数非常有用。

当最近的调用是即将到来的调用的最佳预测时,LRU(最近最少使用的)缓存工作得最好(例如,新闻服务器上的最流行的文章往往每天更换)。缓存的大小限制可确保缓存不会增长,而不受长时间运行的进程(如Web服务器)的限制。

通常,只有在要重用以前计算的值时才应使用LRU高速缓存。因此,,需要在每次调用时创建不同的可变对象的函数,或者诸如time()或random()之类的不纯函数使用LRU是没什么效果的。

静态Web内容的LRU缓存示例:

@lru_cache(maxsize=32)
def get_pep(num):'Retrieve text of a Python Enhancement Proposal'resource = 'http://www.python.org/dev/peps/pep-%04d/' % numtry:with urllib.request.urlopen(resource) as s:return s.read()except urllib.error.HTTPError:return 'Not Found'>>> for n in 8, 290, 308, 320, 8, 218, 320, 279, 289, 320, 9991:
...     pep = get_pep(n)
...     print(n, len(pep))>>> get_pep.cache_info()
CacheInfo(hits=3, misses=8, maxsize=32, currsize=8)

使用高速缓存实现 动态编程 技术有效计算Fibonacci数的示例 :

@lru_cache(maxsize=None)
def fib(n):if n < 2:return nreturn fib(n-1) + fib(n-2)>>> [fib(n) for n in range(16)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]>>> fib.cache_info()
CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)

版本3.2中的新功能。

版本3.3中已更改:添加了typed选项。

译者实例
为了看出lru的效果,我们使用普通的fib函数和使用LRU的fib函数做对比:

def lru_test():def fib(n):if n < 2:return nreturn fib(n - 1) + fib(n - 2)@lru_cache(None)def fib2(n):if n < 2:return nreturn fib2(n - 1) + fib2(n - 2)import timestarttime = time.time()print("before")print(fib(34))print("total",str(time.time() - starttime))print("-".center(50,'*'))starttime = time.time()print("before")print(fib2(450))print(fib2.cache_info())print("total", str(time.time() - starttime))
lru_test()
# 输出结果
before
5702887
total 1.9108920097351074
************************-*************************
before
4953967011875066473162524925231604047727791871346061001150551747313593851366517214899257280600
CacheInfo(hits=448, misses=451, maxsize=None, currsize=451)
total 0.0009984970092773438

可以看到,普通的fib求34的时候已经花费了1.9s,而经过LRU的fib在求450的时候只有不到0.001s的时间。

Python 3.7.1 模块 functools相关推荐

  1. Python标准库笔记(9) — functools模块

    functools 作用于函数的函数 functools 模块提供用于调整或扩展函数和其他可调用对象的工具,而无需完全重写它们. 装饰器 partial 类是 functools 模块提供的主要工具, ...

  2. Python标准库asyncio模块基本原理浅析

    Python标准库asyncio模块基本原理浅析 本文环境python3.7.0 asyncio模块的实现思路 当前编程语言都开始在语言层面上,开始简化对异步程序的编程过程,其中Python中也开始了 ...

  3. Python高级——正则表达式 re模块1.match方法

    python:正则表达式 一.什么是正则表达式 正则表达式也叫做匹配模式(Pattern),它由一组具有特定含义的字符串组成,通常用于匹配和替换文本. 正则表达式,是一个独立的技术,很多编程语言支持正 ...

  4. Python实战之logging模块使用详解

    用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这时候print就不大方便了,所 ...

  5. 【廖雪峰python进阶笔记】模块

    1. 导入模块 要使用一个模块,我们必须首先导入该模块.Python使用import语句导入一个模块.例如,导入系统自带的模块 math: import math 你可以认为math就是一个指向已导入 ...

  6. Python标准库queue模块原理浅析

    Python标准库queue模块原理浅析 本文环境python3.5.2 queue模块的实现思路 作为一个线程安全的队列模块,该模块提供了线程安全的一个队列,该队列底层的实现基于Python线程th ...

  7. Python标准库threading模块Condition原理浅析

    Python标准库threading模块Condition原理浅析 本文环境python3.5.2 threading模块Condition的实现思路 在Python的多线程实现过程中,在Linux平 ...

  8. python之堆heapq模块

    python之堆heapq模块 堆是一种特殊的树形结构,通常我们所说的堆的数据结构指的是完全二叉树,并且根节点的值小于等于该节点所有子节点的值. 堆是非线性的树形的数据结构,有两种堆,最大堆与最小堆. ...

  9. python自定义包或模块在Linux服务器导入错误的解决办法

    python自定义包或模块在Linux服务器导入错误的解决办法 在本地机器上跑python代码,自己定义的文件进行导包运行是没有问题,但是放到linux服务器上的时候就会提示 ImportError: ...

最新文章

  1. c+和python先学哪个比较好-【编程先学什么好,c还是python】python教程c
  2. C语言 计算2-4+6-8+.....+98-100的结果
  3. spark on k8s配置日志存储路径:spark-defaults.conf
  4. 常用公差配合表图_模具设计,常用模具零件选用
  5. LINQ to SQL语句(1)之Where
  6. ODPS2.0重装上阵,优化提升SQL语言表达能力
  7. 老罗的情怀“被”与廉价划等号 锤子“被”选错了对手
  8. python c语言接口_C/C++ 提供 Python 接口
  9. mysql存储过程之循环
  10. EditPlus v2.20 Build 205
  11. k8s认证及ServiceAccount-十五
  12. python pyaudo播放wav声音文件
  13. linux 卸载oracle库,Linux下完美卸载 Oracle
  14. 【“笨办法”学Python】27.记住逻辑关系——布尔逻辑表达式
  15. 【英语】大学英语CET考试,口语部分1(考试介绍与备考,讲义笔记)
  16. 客服如何提高工作效率
  17. 如何使用计算机中对数函数,excel对数函数LN,LOG函数等. 使用示例说明excel如何找到对数...
  18. BW的登录错误解决实例
  19. 服务器 虚拟机版本,VMWARE-版本比较各版本区别
  20. JS_JS截取字符串的三种方法

热门文章

  1. 计算机中专毕业证是什么名,只有一个计算机的中专毕业证能找到什么工作?
  2. 免密认证:从此告别手机验证码
  3. Minecraft 1.19.2 Fabric模组开发 07.自定义NBT标签
  4. qemu运行minix
  5. ImageNet历年冠军模型
  6. Descriptor
  7. 如何利用Vue快速创建一个在线电子表格
  8. Android后台驻留:保活和回收的机制
  9. 2020年中小企业如何快速搭建网站?
  10. java建立http_java-创建一个HttpEntity