泡菜或者JSON?
我需要保存到磁盘一个小dict
对象的键是str
types和值是int
s 然后恢复它 。 像这样的东西:
{'juanjo': 2, 'pedro':99, 'other': 333}
什么是最好的select,为什么? 用pickle
或simplejson
序列化它?
我正在使用Python 2.6。
如果你没有任何互操作性的要求(例如,你只是要用Python的数据),并且二进制格式是好的,那么请使用cPickle ,它可以让你真正快速的Python对象序列化。
如果你想互操作性,或者你想要一个文本格式来存储你的数据,使用JSON(或其他适当的格式取决于你的约束)。
我更喜欢JSON而不是我的序列化。 取消可以运行任意代码,并且使用pickle
在程序之间传输数据或在会话之间存储数据是一个安全漏洞。 JSON不会引入安全漏洞并且是标准化的,所以如果您需要的话,数据可以被不同语言的程序访问。
你也可能会发现这有趣的,有些图表比较: http : //kovshenin.com/archives/pickle-vs-json-which-is-faster/
JSON还是泡菜? JSON 和泡菜怎么样! 你可以使用jsonpickle
。 它易于使用,磁盘上的文件是可读的,因为它是JSON。
如果您主要关心速度和空间,请使用cPickle,因为cPickle比JSON快。
如果您更关心互操作性,安全性和/或人的可读性,则使用JSON。
其他答案中引用的testing结果logging于2010年,2016年更新的cPickle 协议2testing结果显示:
- cPickle加载速度快3.8倍
- 阅读速度提高1.5倍
- cPickle编码稍小
重现这一点 ,这是基于康斯坦丁的基准其他答案引用的基准 ,但使用cPickle与协议2,而不是pickle,并使用json而不是simplejson(因为json比simplejson更快 ),例如
wget https://gist.github.com/jdimatteo/af317ef24ccf1b3fa91f4399902bb534/raw/03e8dbab11b5605bc572bc117c8ac34cfa959a70/pickle_vs_json.py python pickle_vs_json.py
在一个像样的2015 Xeon处理器上使用python 2.7的结果:
Dir Entries Method Time Length dump 10 JSON 0.017 1484510 load 10 JSON 0.375 - dump 10 Pickle 0.011 1428790 load 10 Pickle 0.098 - dump 20 JSON 0.036 2969020 load 20 JSON 1.498 - dump 20 Pickle 0.022 2857580 load 20 Pickle 0.394 - dump 50 JSON 0.079 7422550 load 50 JSON 9.485 - dump 50 Pickle 0.055 7143950 load 50 Pickle 2.518 - dump 100 JSON 0.165 14845100 load 100 JSON 37.730 - dump 100 Pickle 0.107 14287900 load 100 Pickle 9.907 -
Python 3.4与pickle协议3更快。
就个人而言,我通常更喜欢JSON,因为数据是可读的 。 当然,如果你需要序列化的东西,JSON不会采取,比使用泡菜。
但是对于大多数数据存储来说,你不需要序列化任何奇怪的东西,而且JSON更容易,并且总是允许你在文本编辑器中打开它并自己检查数据。
速度不错,但对于大多数数据集的差异可以忽略不计; 反正Python一般不会太快。