Python 如何";“缓存”;耗时的结果?

Python 如何";“缓存”;耗时的结果?,python,caching,Python,Caching,我经常遇到这样的情况,即我有数据,获取数据很耗时。这在调试时变得特别烦人 我通常首先运行查询并将结果转储到pickle中: import pickle d = the_data_query_which_takes_time() with open("cache.pickle", "wb") as f: pickle.dump(d, f) 然后,对于调试/测试: import pickle #d = the_data_query_which_takes_time() with open(

我经常遇到这样的情况,即我有数据,获取数据很耗时。这在调试时变得特别烦人

我通常首先运行查询并将结果转储到pickle中:

import pickle
d = the_data_query_which_takes_time()
with open("cache.pickle", "wb") as f:
    pickle.dump(d, f)
然后,对于调试/测试:

import pickle
#d = the_data_query_which_takes_time()
with open("cache.pickle", "rb") as f:
    d = pickle.load(f)

虽然这基本上是可行的,但它不是一种非常实用的缓存结果的方法。有没有一种更具python风格和可重用性的方法?

我想你正在寻找一种叫做
记忆化的方法

“回忆录”一词是由唐纳德·米奇在去年提出的 1968它是基于拉丁语单词备忘录,意思是“被记住”。不过,这并不是单词记忆的拼写错误 在某种程度上,它有一些共同点。回忆录是一种使用技巧 在计算中加速程序。这是通过记忆来实现的 已处理输入的计算结果,例如 函数调用。如果相同的输入或函数调用具有相同的 使用参数后,可以再次使用以前存储的结果 避免了不必要的计算。在许多情况下,一个简单的数组 用于存储结果,但也可以使用许多其他结构 也可以使用,例如关联数组,在Perl或 Python中的词典

记忆可以由程序员显式编程,但有些 像Python这样的编程语言提供了自动 记忆函数

从Pythonic的角度来看,这通常是通过装饰器或类来完成的。下面是一个涉及装饰师的简单案例:

def memoize(func):
    S = {}
    def wrappingfunction(*args):
        if args not in S:
            S[args] = func(*args)
        return S[args]
    return wrappingfunction

# This function is now memoized
@memoize
def cube(x):
    return x**3
以下是一些帮助您入门的有用链接:


您多长时间重新访问/使用一次
数据查询中的数据,该查询需要花费时间()
?您的调试/测试会话是否与占用大量时间的数据查询分开?您是否在查询和使用之间关闭计算机电源?您是否需要序列化和存储数据,以便以后可以访问或从不同的机器访问?通常,耗时的数据通过API作为脚本的一部分进行查询。然后对其进行进一步处理。我的问题是关于调试过程中的舒适度/速度。当脚本在prod中运行时,我不需要这些数据。这是为了确保在调试模式下启动脚本20次时,我不必等待20次以获取数据。我的例子与我现在所做的非常典型:即,以相同的格式加载预取的数据,就像下载数据一样,以节省时间。您希望该过程与现在的方式有什么不同?你所说的
是什么意思?这不是一种非常实用的方法?@jrd1 posted的记忆化技术看起来像你想要的吗?@wwii:decorators的记忆化技术是我想要的,我会努力使它适应我的情况。我确实在寻找一种“在不修改函数的情况下修改函数”的方法——看起来装饰器是一种不错的选择。修改程序的结构(通过注释掉一些片段、取消注释一些片段等)是我提到的“不太实用的方法”。