Python JSON解码性能

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

我以为json模块有一些本地代码来加速解码?

如何检查是否正在使用?

作为比较,我下载并安装了python-cjson模块,而cjson.decode()在同一个testing用例中需要1秒。

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

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

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

 try: import simplejson as json except ImportError: import json 

在我看来,这是一段时间内最好的成语,在兼容前锋的同时可以提供性能。

新的Yajl – 另一个JSON库非常快。

 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更快。

我正在parsing相同的文件10倍。 文件大小为1,856,944字节。

Python 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 

Python 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 

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

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

在这里我的testing(代码来自: 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 

在windows上查看我的Python 2.6.1安装, json包会加载运行时内置的_json模块。 json speedups模块的C源代码在这里 。

 >>> import _json >>> _json <module '_json' (built-in)> >>> print _json.__doc__ json speedups >>> dir(_json) ['__doc__', '__name__', '__package__', 'encode_basestring_ascii', 'scanstring'] >>> 

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

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

 res = requests.request(...) text = json.loads(res.text) 

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

你可以通过设置字符集来解决这个问题, 然后再调用res.text,并使用cchardet包(参见这里 ):

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

这使得响应文本jsonparsing几乎是即时的!