首页 > 解决方案 > 在python中缓存函数的最后k个结果

问题描述

我想编写一个函数,它接受一个单参数函数 f 和一个整数 k,并返回一个行为与 f 相同的函数,除了它缓存 f 的最后 k 个结果。

例如,如果 memoize 是我们所追求的函数,并且让 mem_f = memoize(f, 2),那么:

    mem_f(arg1) -> f(arg1) is computed and cached  
    mem_f(arg1) -> f(arg1) is returned from cache  
    mem_f(arg2) -> f(arg2) is computed and cached  
    mem_f(arg3) -> f(arg3) is computed and cached, and f(arg1) is evicted

我所做的是:

def memoize(f,k):
    cache = dict()

    def mem_f(*args):
        if args in cache:
            return cache[args]
        result = f(*args)
        cache[args]= result
        return result 
    return mem_f

此函数从缓存中返回结果,如果它不在缓存中,则计算并缓存它。但是,我不清楚如何只缓存 f 的最后 k 个结果?我是新手,任何帮助将不胜感激。

标签: pythonpython-3.xfunctioncachingmemoization

解决方案


你可以只functools.lru_cache用来做缓存。我接受一个maxsize参数来控制它的缓存量:

from functools import lru_cache

@lru_cache(maxsize=2)
def test(n):
    print("calling function")
    return n * 2

print(test(2))
print(test(2))
print(test(3))
print(test(3))
print(test(4))
print(test(4))
print(test(2))

结果:

调用函数
4
4
调用函数
6
6
调用函数
8
8
调用函数
4


推荐阅读