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

时间:2014-06-12 11:49:33

标签: 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("cache.pickle", "rb") as f:
    d = pickle.load(f)

虽然这基本上有效,但它不是一种非常实用的缓存结果的方法。是否有更多的pythonic和可重用的方式?

1 个答案:

答案 0 :(得分:2)

我认为你正在寻找一种名为memoization的东西:

  

Donald Michie在这一年引入了“memoization”一词   它基于拉丁文备忘录,意思是“被记住”。然而,这并不是记忆这个词的拼写错误   在某种程度上它有一些共同点。记忆是一种使用的技术   在计算中加速程序。这是通过记忆来完成的   处理输入的计算结果,如结果   函数调用。如果相同的输入或函数调用相同   使用参数,可以再次使用先前存储的结果   避免了不必要的计算。在许多情况下是一个简单的数组   用于存储结果,但许多其他结构可以   也可以使用,例如关联数组,在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

以下是一些有用的链接,可帮助您入门:

http://www.python-course.eu/python3_memoization.php

https://wiki.python.org/moin/PythonDecoratorLibrary

http://www.thumbtack.com/engineering/a-primer-on-python-decorators/

http://www.pycogsci.info/?p=221