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

转载于:https://www.cnblogs.com/zhang-dan/p/11468947.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值