性能篇——函数调用结果的 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,那么参数 33.0会被当做不同的数据处理。
  • 由于 lru_cache底层是基于字典来实现的缓存,所以参数都必须是 hashable 的,否则会导致报错。

它山之石——未闻code

posted @ 2019-09-05 18:47  东方不败--Never  阅读(552)  评论(0编辑  收藏  举报