人们总说时间会改变一切,但是实际上你需要自己努力去改变!
![](https://img.haomeiwen.com/i7058492/c56a892df45606cf.png)
本质:是函数调用的参数 => 返回值
lru_cache
最近最少使用缓存装饰器,内存不够就清理,内存够就暂时放到那里不清理;在python自带的functools库中
根据参数缓存每次函数调用结果,对于相同参数的,无需重新函数计算,直接返回之前缓存的返回值;
- 如果maxsize设置为None,则禁用LRU功能,并且缓存可以无限制增长;当maxsize是2的幂时,LRU功能执行得最好;
- 如果 typed设置为True, 则不同类型的函数参数将单独缓存。例如,f(3)和f(3.0)将被视为具有不同结果的不同调用;
- 缓存是有内存存储空间限制的;
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))
网友评论