python - 什么更快 - 将 pickle 字典对象加载或加载 JSON 文件 - 到字典?

标签 python json pickle simplejson

<分区>

什么更快:

(A) 使用 pickle.load()“Unpickling”(加载)pickle 字典对象

(B) 使用 simplejson.load() 将 JSON 文件加载到字典中

假设:pickled 对象文件在案例 A 中已经存在, 并且 JSON 文件在案例 B 中已经存在。

最佳答案

速度实际上取决于数据,它的内容和大小。

但是,无论如何,让我们以 json 数据为例,看看哪个更快(Ubuntu 12.04,python 2.7.3):

将此 json 结构转储到 test.jsontest.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 进行解 pickle 根本不是那么快 - 如果您选择 pickle/解 pickle 选项,cPickle 绝对是可行的方法。 ujson 在这些针对特定数据的 json 解析器中看起来很有前途。

此外,jsonsimplejson 库在 pypy 上加载速度更快(参见 Python JSON Performance)。

另见:

请务必注意,在您的特定系统、其他类型和大小的数据上,结果可能会有所不同。

关于python - 什么更快 - 将 pickle 字典对象加载或加载 JSON 文件 - 到字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18517949/

相关文章:

jquery - 使用 $.getJSON 将 Rails 渲染的 JSON 拉入 JavaScript(作为 JSON 对象)

python - python的pp模块上的PicklingError

python - 为什么在 Python 中需要在哈希之前声明编码,以及如何执行此操作?

python - 如何在二维数组中使用 numpy.searchsorted 进行矢量化

带有 GSON 的 Java JSON

javascript - 为什么 JavaScript 中只显示数组的最后一个元素而不是所有元素

python - 带有引号的Python 2.7.6字符串文字错误

python - reshape Pandas 数据框分组变量

python - pickle 和打开文件之间的区别?

python - 使用Python的pickle打开和保存字典