18.3-lru_cache 缓存装饰器

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

Python 小技巧 —— 用类写装饰器
Python装饰器(上)

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

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 缓存装饰器)