45

我正在使用jsonPython 2.6 中的模块来加载和解码 JSON 文件。但是,我目前的表现比预期的要慢。json.loads()我正在使用一个大小为 6MB 且需要 20 秒的测试用例。

我认为该json模块有一些本机代码来加速解码?

我如何检查是否正在使用它?

作为比较,我下载并安装了python-cjson模块,并且cjson.decode()对于相同的测试用例需要 1 秒。

我宁愿使用 Python 2.6 提供的 JSON 模块,这样我的代码的用户就不需要安装额外的模块。

(我在 Mac OS X 上开发,但在 Windows XP 上得到了类似的结果。)

4

7 回答 7

31

新的Yajl - Yet Another JSON Library非常快。

yajl        serialize: 0.180  deserialize: 0.182  total: 0.362
simplejson  serialize: 0.840  deserialize: 0.490  total: 1.331
stdlib json serialize: 2.812  deserialize: 8.725  total: 11.537

您可以自己比较这些库

更新: UltraJSON更快。

于 2011-04-28T15:29:52.973 回答
23

它可能因平台而异,但内置 json 模块基于simplejson,不包括 C 加速。无论如何,我发现 simplejson 和 python-cjson 一样快,所以我更喜欢它,因为它显然具有与内置相同的接口。

try:
    import simplejson as json
except ImportError:
    import json

在我看来,这是一段时间内最好的习惯用法,在向前兼容的同时产生可用的性能。

于 2009-04-01T16:30:29.767 回答
17

我正在解析同一个文件 10 倍。文件大小为 1,856,944 字节。

蟒蛇2.6:

yajl        serialize: 0.294  deserialize: 0.334  total: 0.627
cjson       serialize: 0.494  deserialize: 0.276  total: 0.769
simplejson  serialize: 0.554  deserialize: 0.268  total: 0.823
stdlib json serialize: 3.917  deserialize: 17.508 total: 21.425

蟒蛇 2.7:

yajl        serialize: 0.289  deserialize: 0.312  total: 0.601
cjson       serialize: 0.232  deserialize: 0.254  total: 0.486
simplejson  serialize: 0.288  deserialize: 0.253  total: 0.540
stdlib json serialize: 0.273  deserialize: 0.256  total: 0.528

不知道为什么数字与您的结果不成比例。我猜,更新的图书馆?

于 2013-01-25T00:09:00.147 回答
15

看看 UltraJSON https://github.com/esnme/ultrajson

这是我的测试(代码来自:https ://gist.github.com/lightcatcher/1136415 )

平台:OS X 10.8.3 MBP 2.2 GHz Intel Core i7

JSON:

simplejson==3.1.0

python-cjson==1.0.5

jsonlib==1.6.1

ujson==1.30

yajl==0.3.5

JSON Benchmark
2.7.2 (default, Oct 11 2012, 20:14:37)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)]
-----------------------------
ENCODING
simplejson: 0.293394s
cjson: 0.461517s
ujson: 0.222278s
jsonlib: 0.428641s
json: 0.759091s
yajl: 0.388836s

DECODING
simplejson: 0.556367s
cjson: 0.42649s
ujson: 0.212396s
jsonlib: 0.265861s
json: 0.365553s
yajl: 0.361718s
于 2013-03-15T19:41:37.283 回答
3

对于那些使用 requests 包解析请求输出的人,例如:

res = requests.request(...)

text = json.loads(res.text)

对于较大的响应内容,这可能会非常慢,比如我的 2017 MacBook 上的 6 MB 大约 45 秒。它不是由缓慢的 json 解析器引起的,而是由 res.text 调用的缓慢字符集确定引起的。

您可以通过在调用 res.text之前设置字符集并使用cchardet包来解决此问题(另请参见此处):

if res.encoding is None:
    res.encoding = cchardet.detect(res.content)['encoding']

这使得响应文本 json 解析几乎是即时的!

于 2017-10-08T16:58:29.660 回答
2

查看我在 Windows 上安装的 Python 2.6.1,该json包加载了_json内置于运行时的模块。模块的C来源在这里json speedups

>>> import _json
>>> _json
<module '_json' (built-in)>
>>> print _json.__doc__
json speedups
>>> dir(_json)
['__doc__', '__name__', '__package__', 'encode_basestring_ascii', 'scanstring']
>>> 
于 2009-04-01T16:04:36.397 回答
1

尽管_json可用,但我注意到 CPython 2.6.6 上的 json 解码非常慢。我没有与其他实现进行比较,但是在性能关键循环中我已经切换到字符串操作。

于 2011-04-04T16:20:30.963 回答