我有一个相当大的二进制格式的pickle(dict)文件,每次从中查找分数时都需要几秒钟的时间加载。我想知道是否可以在内存中加载文件一次并从中查找,直到我退出程序。此外,如果有任何其他方法可以加快我的搜索速度 提前谢谢了。
答案 0 :(得分:2)
加载数据然后传递该引用,而不是每次查找分数时再次加载它。现在我不知道你的代码是什么样子,但是一个简单的例子:
def lookup(data):
// do stuff with data
data = Pickle.load("file")
lookup(data)
答案 1 :(得分:2)
当我遇到这种问题时,我通常会创建一个函数并使用memoize装饰器进行装饰。在http://wiki.python.org/moin/PythonDecoratorLibrary
上查找“Memoize”例如:
@memoized
def get_dict():
return pickle.load(file)
foo = get_dict()['foo']
在此处使用memoization而不是在加载时执行此操作会使这种情况变得懒散,因此如果您在程序的某些使用过程中最终没有使用该文件,则无需支付加载它的成本。
另外,像另一张海报建议你应该使用cPickle:
import cPickle as pickle
您可能还会考虑打破大字典,可能经常在一个泡菜中使用数据而在其他泡菜中使用较少的数据。
答案 2 :(得分:1)
shelve是另一种选择。
答案 3 :(得分:1)
使用cPickle模块而不是Pickle将加速pickle机制,但将未打开的dict保留在内存中是一个好主意。
答案 4 :(得分:0)
将代码放入模块(主要是将其放在一个单独的文件中),然后在需要进行一些查找时加载模块。
让模块初始化其data
变量。这只会在首次导入时发生。如果程序的其他部分import
为同一模块,系统缓存版本将自动使用,其中的代码将不再运行。
<强> mymodule.py 强>
import pickle
data = pickle.load(open("picklefile", "rb"))
<强> program.py 强>
import mymodule
value = mymodule.data[key]