什么更快:
(A) 使用pickle.load()
反序列化(pickled)字典对象, 或
(B) 使用simplejson.load()
从JSON文件加载到字典中
假设: 在情况A中,pickled对象文件已经存在;在情况B中,JSON文件已经存在。
什么更快:
(A) 使用pickle.load()
反序列化(pickled)字典对象, 或
(B) 使用simplejson.load()
从JSON文件加载到字典中
假设: 在情况A中,pickled对象文件已经存在;在情况B中,JSON文件已经存在。
实际上,速度取决于数据的内容和大小。
但是,不管怎样,我们可以举个例子,看看哪种方法更快(Ubuntu 12.04,Python 2.7.3):
假设有这个JSON结构被转储到test.json
和test.pickle
文件中:
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
测试脚本:
import timeit
import pickle
import cPickle
import json
import simplejson
import ujson
import yajl
def load_pickle(f):
return pickle.load(f)
def load_cpickle(f):
return cPickle.load(f)
def load_json(f):
return json.load(f)
def load_simplejson(f):
return simplejson.load(f)
def load_ujson(f):
return ujson.load(f)
def load_yajl(f):
return yajl.load(f)
print "pickle:"
print timeit.Timer('load_pickle(open("test.pickle"))', 'from __main__ import load_pickle').timeit()
print "cpickle:"
print timeit.Timer('load_cpickle(open("test.pickle"))', 'from __main__ import load_cpickle').timeit()
print "json:"
print timeit.Timer('load_json(open("test.json"))', 'from __main__ import load_json').timeit()
print "simplejson:"
print timeit.Timer('load_simplejson(open("test.json"))', 'from __main__ import load_simplejson').timeit()
print "ujson:"
print timeit.Timer('load_ujson(open("test.json"))', 'from __main__ import load_ujson').timeit()
print "yajl:"
print timeit.Timer('load_yajl(open("test.json"))', 'from __main__ import load_yajl').timeit()
输出:
pickle:
107.936687946
cpickle:
28.4231381416
json:
31.6450419426
simplejson:
20.5853149891
ujson:
16.9352178574
yajl:
18.9763481617
从结果可以看出,使用pickle
进行反序列化的速度并不快 - 如果选择序列化/反序列化选项,那么cPickle
绝对是首选。在这些JSON解析器中,ujson
在特定数据上看起来很有前途。
此外,json
和simplejson
库在pypy上加载速度要快得多(请参见Python JSON性能)。
另请参见:
需要注意的是,在您的特定系统以及其他类型和大小的数据上,结果可能会有所不同。
ujson
和 cPickle
。 - alecxecPickle
和 ujson
在这里改变了整个情况 :) - alecxeyajl
添加到基准测试中。 - alecxe