泡菜或者JSON?

我需要保存到磁盘一个小dict对象的键是strtypes和值是int s 然后恢复它 。 像这样的东西:

 {'juanjo': 2, 'pedro':99, 'other': 333} 

什么是最好的select,为什么? 用picklesimplejson序列化它?

我正在使用Python 2.6。

如果你没有任何互操作性的要求(例如,你只是要用Python的数据),并且二进制格式是好的,那么请使用cPickle ,它可以让你真正快速的Python对象序列化。

如果你想互操作性,或者你想要一个文本格式来存储你的数据,使用JSON(或其他适当的格式取决于你的约束)。

我更喜欢JSON而不是我的序列化。 取消可以运行任意代码,并且使用pickle在程序之间传输数据或在会话之间存储数据是一个安全漏洞。 JSON不会引入安全漏洞并且是标准化的,所以如果您需要的话,数据可以被不同语言的程序访问。

你也可能会发现这有趣的,有些图表比较: http : //kovshenin.com/archives/pickle-vs-json-which-is-faster/

JSON还是泡菜? JSON 泡菜怎么样! 你可以使用jsonpickle 。 它易于使用,磁盘上的文件是可读的,因为它是JSON。

http://jsonpickle.github.com/

如果您主要关心速度和空间,请使用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一般不会太快。

Interesting Posts