美文网首页Python全栈工程师
18.3-lru_cache 缓存装饰器

18.3-lru_cache 缓存装饰器

作者: BeautifulSoulpy | 来源:发表于2019-09-18 16:51 被阅读0次

人们总说时间会改变一切,但是实际上你需要自己努力去改变!

本质:是函数调用的参数 => 返回值

lru_cache

最近最少使用缓存装饰器,内存不够就清理,内存够就暂时放到那里不清理;在python自带的functools库中

根据参数缓存每次函数调用结果,对于相同参数的,无需重新函数计算,直接返回之前缓存的返回值;

  1. 如果maxsize设置为None,则禁用LRU功能,并且缓存可以无限制增长;当maxsize是2的幂时,LRU功能执行得最好;
  2. 如果 typed设置为True, 则不同类型的函数参数将单独缓存。例如,f(3)和f(3.0)将被视为具有不同结果的不同调用;
  3. 缓存是有内存存储空间限制的;
from functools import lru_cache
import time

def a(x=3):
    time.sleep(3)
    print(x)
    return x+1

print(a())
print(a())
---------
3
4
3
4

@lru_cache()
def a(x=3):
    time.sleep(3)
    print(x)
    return x+1

print(a(x=4))
print(a())
--------------------------------
4
5
3
4

print(a(4))  # a(x=4) a(5) 都不一样,要重新开始算
print(a())
------------------------
4
5
3
4


例2:
from functools import lru_cache
import time

@lru_cache()
def add(x=4,y=5):
    time.sleep(3)
    return x+1

print(1,add(4,5))  #第1次,都缓存3秒;计算结果;
print(2,add(4))
print(3,add(y=5))
print(4,add(x=4,y=5))
print(5,add(y=5,x=4))
--------------------------------
1 5
2 5
3 5
4 5
5 5

print(1,add(4,5))  #第2次,直接从缓存中提取结果
print(2,add(4))
print(3,add(y=5))
print(4,add(x=4,y=5))
print(5,add(y=5,x=4))
--------------------------------
1 5
2 5
3 5
4 5
5 5

print(1,add(4.0,5))
----------------------------------
1 5

缓存数据是并不一定快;看缓存的代价;缓存的时效大小;

redius:
缓存与缓冲:cache 与 buffer

fib序列的改造
# 多次调用递归会很慢
def fibonacci(n):
    if n==1:
        return 1
    elif n==2:
        return 1
    elif n>2:
        return fibonacci(n-1)+fibonacci(n-2)

for i in range(1,101):
    print(i,":",fibonacci(i)) 


解决办法1:记忆法
fibonacci_dic={}

def fibonacci(n):
    if n in fibonacci_dic:
        return fibonacci_dic[n]
    if n==1:
        value= 1
    elif n==2:
        value= 1
    elif n>2:
        value=fibonacci(n-1)+fibonacci(n-2)
    fibonacci_dic[n]=value
    return value

for i in range(1,101):
    print(i,":",fibonacci(i))

解决办法2:装饰符
from functools import lru_cache
@lru_cache(maxsize=1000)
def fibonacci(n):
    if n==1:
        return 1
    elif n==2:
        return 1
    elif n>2:
        return fibonacci(n-1)+fibonacci(n-2)

for i in range(1,101):
    print(i,":",fibonacci(i)) 

相关文章

  • 18.3-lru_cache 缓存装饰器

    人们总说时间会改变一切,但是实际上你需要自己努力去改变! 本质:是函数调用的参数 => 返回值 lru_cache...

  • 装饰器

    """@装饰器- 普通装饰器- 带参数的装饰器- 通用装饰器- 装饰器装饰类- 内置装饰器- 缓存装饰器- 类实现...

  • Mybatis的这两个缓存装饰器不要忽略

    Mybatis的这两个缓存装饰器不要忽略这篇文章继续介绍聊聊Mybatis的缓存的其他装饰者 引用的缓存装饰器So...

  • Python 高级编程系列(二)

    Python 装饰器常见用法 装饰器与spring 中的AOP类似 通过装饰器可以实现面向切面的注入 一:缓存 ...

  • 聊聊缓存

    本地缓存:mybatis实现:装饰器模式实践 PerpetualCache:永久缓存:通过HashMap实现最大容...

  • 装饰器

    函数装饰器:通常用于插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计 类装饰器:...

  • Cache Decorator

    二级缓存装饰器 PerpetualCache 实现了 Cache 接口,提供了缓存的基本功能,为了 Perpetu...

  • 缓存

    本地数据库缓存在settings文件中添加: 2.在终端: 在view中使用:也用了装饰器 使用redis缓存: ...

  • Python 创建单例模式的三种方式

    方法一:使用装饰器 装饰器维护一个字典对象instances,缓存了所有单例类,只要单例不存在则创建,已经存在直接...

  • 十、DRF缓存使用

    使用时机: 1. 安装 2. 使用方法 1. 直接添加装饰器 timeout 缓存时间 cache 缓存使用的Dj...

网友评论

    本文标题:18.3-lru_cache 缓存装饰器

    本文链接:https://www.haomeiwen.com/subject/pqlkuctx.html