性能篇——函数调用结果的 LRU 缓存
1. 应用场景:
多次调用同一函数
2. 普通写法:
1 def say(name): 2 print("hellow:%s"%name) 3 now = datetime.datetime.now() 4 return now 5 6 now = say('tom') 7 print("time:%s"%now) 8 time.sleep(5) 9 10 now = say('tom') 11 print("time:%s"%now)
结果:
hellow:tom
time:2019-09-05 18:20:19.637917
hellow:tom
time:2019-09-05 18:20:24.639228
3. 缓存写法:
1 import time 2 import datetime 3 from functools import lru_cache 4 5 @lru_cache(maxsize=32) 6 def say(name): 7 print("hellow:%s"%name) 8 now = datetime.datetime.now() 9 return now 10 11 now = say('tom') 12 print("time:%s"%now) 13 time.sleep(5) 14 15 now = say('tom') 16 print("time:%s"%now)
结果:
hellow:tom
time:2019-09-05 16:30:22.451122
time:2019-09-05 16:30:22.451122
4. 总结:
- LRU 算法规则:最近最常使用的参数生成的结果,我们存下来,下次遇到相同的参数时直接返回结果。而不常出现的参数,等到需要的时候再计算。计算完成后,也先存下来。但是如果缓存空间不够了,不常使用的会先删除。
lru_cache(maxsize=128,typed=False)
接收两个参数,第一个参数maxsize
表示最多缓存多少个结果,这个数字建议设置为2的幂。超出这个结果就会启用 LRU 算法删除不常用的数据。第二个参数typed
表示是否检查参数类型,默认为False
,如果设置为True
,那么参数3
和3.0
会被当做不同的数据处理。- 由于
lru_cache
底层是基于字典来实现的缓存,所以参数都必须是 hashable 的,否则会导致报错。
它山之石——未闻code