gpt4 book ai didi

python - 用于后续在 python 中运行的缓存工具

转载 作者:行者123 更新时间:2023-12-01 13:19:32 28 4
gpt4 key购买 nike

我是初学者。对不起,如果我的问题很幼稚。 python 中的缓存工具是否适用于后续运行?

import cachetools
import time


@cachetools.cached({})
def find_sum(n):
time.sleep(5)
return n+2


print find_sum(2)
print find_sum(3)
print find_sum(2)

因此,在第一次运行期间,第三次调用更快,但下次我运行文件时,我希望第一次调用更快并从缓存中获取结果。缓存工具可以做到这一点吗?

最佳答案

cachetools 不能开箱即用。但是很容易添加。

您可以将任何您想要的可变映射传递给 memoizing decorators .您使用的是普通的旧字典,而字典很容易腌制。即使您使用其中一种花哨的cache implementations由图书馆提供,它们也很容易腌制。1

所以:

import cachetools
import pickle
import time

try:
with open('mycache.pickle', 'rb') as f:
cache = pickle.load(f)
except FileNotFoundError:
cache = {} # or cachetools.LRUCache(maxsize=5) or whatever you want

@cachetools.cached(cache)
def find_sum(n):
time.sleep(5)
return n+2

print(find_sum(2))
print(find_sum(3))
print(find_sum(2))

with open('mycache.pickle', 'wb') as f:
pickle.dump(cache, f)

当然可以添加:
  • 一个 finally或上下文管理器或 atexit即使遇到异常或 ^C,也要确保在关机时保存文件。
  • 一个经常保存它们的计时器。
  • 缓存对象上的一个钩子(Hook),用于在每次更新或每 N 次更新时保存。 (只需覆盖 __setitem__ 方法,或者查看 Extending cache classes 了解您可以做的其他事情,如果您使用其中一个更高级的类而不是 dict。)


  • 或者,您甚至可以使用磁盘键值数据库作为缓存。

    最简单的此类数据库是 dbm .仅限 str/ bytes对于键和值。 (如果你想要非字符串值,你可以使用 shelve ;如果你想要非字符串键,你可能想要一个不同的解决方案。)所以,这对我们的例子来说不太适用。但对于一个类似的例子,这几乎是魔法:
    import dbm
    import time
    import cachetools

    cache = dbm.open('mycache.dbm', 'c')
    @cachetools.cached(cache, key=lambda s:s)
    def find_string_sum(s):
    time.sleep(5)
    return s + '!'

    print(find_string_sum('a'))
    print(find_string_sum('b'))
    print(find_string_sum('a'))

    唯一棘手的一点是我必须覆盖 key功能。 (默认键函数处理 *args, **kw ,因此对于参数 'a' 你最终会得到类似 (('a',), ()) 的东西,这显然不是字符串。)

    1.从 the source可以看出,有错误修复以确保所有类在所有受支持的 Python 版本中都是可挑选的,所以这显然是有意的。

    关于python - 用于后续在 python 中运行的缓存工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50962608/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com