性能篇——函数调用结果的 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)

结果:spa

hellow:tom
time:2019-09-05 18:20:19.637917
hellow:tom
time:2019-09-05 18:20:24.639228code

 

3. 缓存写法:blog

 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)

结果:hash

hellow:tom
time:2019-09-05 16:30:22.451122
time:2019-09-05 16:30:22.451122class

 

4. 总结:import

  • LRU 算法规则:最近最常使用的参数生成的结果,咱们存下来,下次遇到相同的参数时直接返回结果。而不常出现的参数,等到须要的时候再计算。计算完成后,也先存下来。可是若是缓存空间不够了,不常使用的会先删除。
  • lru_cache(maxsize=128,typed=False)接收两个参数,第一个参数 maxsize表示最多缓存多少个结果,这个数字建议设置为2的幂。超出这个结果就会启用 LRU 算法删除不经常使用的数据。第二个参数 typed表示是否检查参数类型,默认为 False,若是设置为 True,那么参数 33.0会被当作不一样的数据处理。
  • 因为 lru_cache底层是基于字典来实现的缓存,因此参数都必须是 hashable 的,不然会致使报错。

它山之石——未闻codedate

相关文章
相关标签/搜索