摄影:产品经理
在工程项目中,可能有一些函数调用耗时很长,可是又须要反复屡次调用,而且每次调用时,相同的参数获得的结果都是相同的。在这种状况下,咱们可能会使用变量或者列表来存放,例如:算法
resp_1 = get_resp(param=1) resp_2 = get_resp(param=2) resp_3 = get_resp(param=3)
可是,若是返回的结果占用内存比较大,咱们每次调用都把结果存在内存里面,就会消耗大量内存。缓存
因而,咱们可使用 LRU 算法:最近最常使用的参数生成的结果,咱们存下来,下次遇到相同的参数时直接返回结果。而不常出现的参数,等到须要的时候再计算。计算完成后,也先存下来。可是若是缓存空间不够了,不常使用的会先删除。ide
LRU 的算法本身手动实现起来比较麻烦,但好在 Python 的 functions模块已经提供了现成的 lru_cache装饰器供咱们使用。函数
首先咱们写一个不带 lru 算法的程序:code
import time import datetime def say(name): print(f'你好:{name}') now = datetime.datetime.now() return now now = say('kingname') print(f'如今时间为:{now}') time.sleep(10) now = say('产品经理') print(f'如今时间为:{now}') time.sleep(10) now = say('kingname') print(f'如今时间为:{now}')
运行效果以下图所示:blog
从运行结果能够看到,调用函数三次,第一次和第三次传入的参数都是 kingname,第二次传入的参数为 产品经理, 你好:kingname打印了两次, 你会:产品经理打印了一次。第二次打印的时间比第一次多了10秒,第三次打印的时间比第二次多了10秒。内存
如今咱们把 LRU 缓存加上。get
import time import datetime from functools import lru_cache @lru_cache(maxsize=32) def say(name): print(f'你好:{name}') now = datetime.datetime.now() return now now = say('kingname') print(f'如今时间为:{now}') tie.sleep(10) now = say('产品经理') print(f'如今时间为:{now}') time.sleep(10) now = say('kingname') print(f'如今时间为:{now}')
从打印出来的结果能够看出,第三次调用 say函数的时候,传入的也是 kingname,可是函数根本没有运行,因此没有打印第二个 你好:kingname。而且第三个时间与第一个时间彻底相同。说明第三次调用函数的时候,直接读取的缓存。产品
lru_cache(maxsize=128,typed=False)接收两个参数,第一个参数 maxsize表示最多缓存多少个结果,这个数字建议设置为2的幂。超出这个结果就会启用 LRU 算法删除不经常使用的数据。第二个参数 typed表示是否检查参数类型,默认为 False,若是设置为 True,那么参数 3和 3.0会被当作不一样的数据处理。hash
因为 lru_cache底层是基于字典来实现的缓存,因此参数都必须是 hashable 的,不然会致使报错。