Python LRU Cache

9 篇文章 0 订阅
7 篇文章 0 订阅

这个题目leetcode里也有,因为要满足1)快速地get 2)与加入时间相关的pop out 两个operations。用python的OrdereDdict实现:

from collections import OrderedDict

class LRUCache:
    
    def __init__(self, capacity):
        self._cache = OrderedDict()
        self.capacity = capacity
        
    def get(self, key: int) -> int:
        if key not in self._cache:
            return -1
        self._cache.move_to_end(key)
        return self._cache[key]
    
    def put(self, key: int, value: int):
        self._cache[key] = value
        self._cache.move_to_end(key)
        if len(self._cache) > self.capacity:
            self._cache.popitem(last=False)

Python的OrderedDict一共就多提供了两个接口,popitem()以及 move_to_end() 这个LRU_cache问题中就全用到了。。。

真正用python解决问题的时候,或者是面试时想使用lru_cache,不用麻烦自己去编这个东西,python functools里就有这个,我通常使用decorator形式。下面用最简单的fibonacci问题展示一下:

from functools import lru_cache

class Solution:
    @lru_cache(maxsize=None)
    def fib(self, n: int) -> int:
        if n == 0:
            return 0
        if n == 1:
            return 1
        return self.fib(n-1) + self.fib(n-2)

本来递归exponential的复杂度,加了个decorator立马老老实实地回归本来面目成linear,真是不错;而且真的在工程实践的时候,递归的代码通常要清晰很多,所以本来类似的解决方案就很可能是最好选择。有点可惜的是,因为lru_cache底层就是用一个类似OrderedDict的东西实现的,所以它只能被用在函数签名可以被hash的情况下,也是没有办法的事情。不过像我这么喜欢用这个东西的人,是愿意改改函数签名去使用它的。

顺便说一句,因为时刷题或面试,不用考虑内存开销,maxsize直接开成最大就好。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值