我有一个应用程序以键值格式在磁盘上保存数据。该文件可能会变得相当大。我希望我的python脚本读取这些数据,我想知道 - 如果我将此数据格式化为有效的python dict {key1:value1,key2:value2...}
然后导入文件以使用它,那么与阅读相比,这会带来任何显着的性能提升吗在文本文件中,将其拆分为key:value
对并将其存储到dict中?
由于
答案 0 :(得分:4)
JSON是存储类似dict的数据的标准方法,并且存在非常快速的读/写JSON数据的实现,例如,在python' s standard library中。尝试:
import json
with open(f) as F:
data = json.load(F)
如果您可以破坏文件格式的人类可读性,您也可以尝试使用BSON(二进制JSON编码)。
答案 1 :(得分:1)
在我的示例中,我将假设dct
包含我们要加载的词典。
repr(dct)
将repr(dct)
创建的字符串中的值保存到文件中是一种选择。
此文件可以通过以下方式加载:
import ast
def fromdct(fname):
with open(fname) as f:
return ast.literal_eval(f.read())
import json
def fromjson(fname):
with open(fname) as f:
return json.load(f)
假设 data.py 包含以下内容:
data = {"a": 11, "b": 22, ...large dictionary}
您可以通过
阅读数据from data import data
为了进行测试,我创建了一个包含100万个键值对的字典:
>>> dct = {"a" + str(i): for i in range(1000000)}
序列化(跳过此处)
和将数据转换为变量所需的测量时间:
>>> %timeit fromdct("data.dct")
1 loops, best of 3: 5.21 s per loop
>>> %timeit fromjson("data.json")
1 loops, best of 3: 773 ms per loop
>>> %timeit from data import data
1 loops, best of 3: 2.15 µs per loop
正如我们所见,从Python模块加载数据真的很快
json
库,这些可以更快如果字典中的数据量变大,可能会遇到问题,可能会占用太多内存。如果您必须从程序的多个实例中读取数据,这可能会变得至关重要。
在这里,Redis可能有所帮助。它允许存储键值对,其中值总是一些二进制数据。您必须通过pickle或JSON序列化它们。
优点是:
缺点:
ats.literal_eval
加载非常慢