python - 在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 个结果?我是新手,任何帮助将不胜感激。
解决方案
你可以只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
推荐阅读
- xamarin.forms - System.Text.Json.JsonSerializer 的 Xamarin Refit 类型初始化程序引发异常
- bash - 如何在bash脚本中执行存储在heredoc中的curl命令?
- c++ - 将一个数组元素与下一个元素进行比较以找出最大的元素
- powershell - 尝试使用 -Server 和 -Credential 时出现 Get-ADPrincipalGroupMembership 错误?
- python - 如何查看用户取消订单后是否从同一家商店回购?
- php - 将 Laravel 7 工厂重构为 Laravel 8
- flutter - 主题数据中的原色不起作用
- python - 删除反向键的方法:python map dict中的值对?
- postgresql - 在 PostgreSQL 中存储 UUID 的最佳数据类型是什么?
- linux - 多个显示器有时会停止在 RHEL8 桌面上工作