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几乎是即时的!