python - 有没有比 pickle 或常规 Python 文件更快的方法来存储大字典?

标签 python pickle

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

3年前关闭。
社区在 3 个月前审查了是否重新打开此问题并将其关闭:

原始关闭原因未解决





Improve this question




我想存储一个只包含以下格式数据的字典:

{
    "key1" : True,
    "key2" : True,
    .....
}

换句话说,只是一种快速检查 key 是否有效的方法。我可以通过存储一个名为 foo 的字典来做到这一点在一个名为 bar.py 的文件中,然后在我的其他模块中,我可以按如下方式导入它:
from bar import foo

或者,我可以将它保存在一个名为 bar.pickle 的 pickle 文件中。 , 并将其导入文件顶部,如下所示:
import pickle  
with open('bar.pickle', 'rb') as f:
    foo = pickle.load(f)

哪个是理想的,更快怎么做?

最佳答案

要添加到@scnerd 的评论,这里是 IPython 中针对不同负载情况的时间安排。

在这里,我们创建一个字典并将其写入 3 种格式:

import random
import json
import pickle

letters = 'abcdefghijklmnopqrstuvwxyz'
d = {''.join(random.choices(letters, k=6)): random.choice([True, False]) 
     for _ in range(100000)}

# write a python file
with open('mydict.py', 'w') as fp:
    fp.write('d = {\n')
    for k,v in d.items():
        fp.write(f"'{k}':{v},\n")
    fp.write('None:False}')

# write a pickle file
with open('mydict.pickle', 'wb') as fp:
    pickle.dump(d, fp)

# write a json file
with open('mydict.json', 'wb') as fp:
    json.dump(d, fp)

python 文件:
# on first import the file will be cached.  
%%timeit -n1 -r1
from mydict import d

644 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)

# after creating the __pycache__ folder, import is MUCH faster
%%timeit
from mydict import d

1.37 µs ± 54.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

pickle 文件:
%%timeit
with open('mydict.pickle', 'rb') as fp:
    pickle.load(fp)

52.4 ms ± 1.03 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

.json 文件:
%%timeit
with open('mydict.json', 'rb') as fp:
    json.load(fp)

81.3 ms ± 2.21 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

# here is the same test with ujson
import ujson

%%timeit
with open('mydict.json', 'rb') as fp:
    ujson.load(fp)

51.2 ms ± 304 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

关于python - 有没有比 pickle 或常规 Python 文件更快的方法来存储大字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54012026/

相关文章:

python - 在 Flask 应用程序中设置日期时间

python - 我怎样才能加快网络应用程序的速度? (避免重建结构。)

serialization - mpi4py:替换内置序列化

python - 加载pickled数据时cPickle EOFError

python - cPickle 导入错误 : No module named multiarray

Python 列出从模块导入的所有子模块

python - 通过数据帧的子集更有效地使用 Python for 循环

python - 如何使用 `slice` 对象读取 pytables.CArray?

生成 VCF 文件的 Python 库?

python - 解码 Pickle Python 的输出