我经常遇到需要获取数据的数据。这在调试时变得特别烦人。
我通常做的是首先运行查询并将结果转储到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和可重用的方式?
答案 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/