这不适用于符合您描述的所有情况,但cPickle
应该有助于提高速度。
我能想到的唯一问题是,将数据持久性与 IPC 结合起来很困难。因此,如果这些不同的程序同时修改字典,pickle
将无济于事。另一种方法可能是使用数据库...
我喜欢Sven Marnach的建议,但有一些权衡值得考虑。一些设置...
>>> pickle_file = open('pickle_foo', 'w')
>>> anydbm_file = anydbm.open('anydbm_foo', 'c')
>>> d = dict((str(i), str(j)) for i, j in zip(range(999999, -1, -1), range(0, 1000000)))
显然填充anydbm_file
将非常缓慢:
>>> %timeit for k, v in d.iteritems(): anydbm_file[k] = v
1 loops, best of 3: 5.14 s per loop
该时间与转储和加载 pickle 文件所需的时间相当:
>>> %timeit cPickle.dump(d, pickle_file)
1 loops, best of 3: 3.79 s per loop
>>> pickle_file.close()
>>> pickle_file = open('pickle_foo', 'r')
>>> %timeit d = cPickle.load(pickle_file)
1 loops, best of 3: 2.03 s per loop
但是anydbm_file
您只需创建一次;然后,再次打开它几乎是瞬间的。
>>> %timeit anydbm_file = anydbm.open('anydbm_foo', 'r')
10000 loops, best of 3: 74.3 us per loop
所以anydbm
那里有优势。另一方面,
>>> %timeit for i in range(1, 1000): x = anydbm_file[str(i)]
100 loops, best of 3: 3.15 ms per loop
>>> %timeit for i in range(1, 1000): x = d[str(i)]
1000 loops, best of 3: 374 us per loop
从anydbm_file
内存中读取一个键的时间是从字典中读取一个键的十倍。您必须进行大量查找才能使这种差异超过泡菜转储/加载周期所需的 5 秒;但即使您不这样做,此处读取时间的差异也可能导致性能下降,具体取决于您在做什么。
其他选项是SQLite3
or(对于允许来自多个同时运行的进程的连接的单独数据库服务器进程),psycopg2
+ PostgreSQL。