Python更快的解析JSON大文件

提出问题

今天用python的simplejson库解析一个 >200MB 的JSON文件,发现一次decode/encode都得要 >10s,这个在我开来,实在太慢了,有没有更快的库了?

先给出我的简单测试结果

  • json大小:245MB

  • 测试方法:read文件内容,然后一次decode, 一次encode

解释器simplejsonjsonujson
pypy40s多10s
cpython12s多17s多10s多
  • 不成熟的结论: pypy+json最快

方法一:pypy+json

python自带的JSON库是用纯python代码实现的,而pypy对纯python代码的加速效果比较好。至于为什么,大家可以去google吧,很多文章解释的很好。

方法二:UltraJson

  • 我首先想到的用C库来做JSON的解析,原因你懂的,而C语言有个JSON库叫CJSON,于是用python+cjson在google里找到了UltraJson

  • UltraJson是作者用C语言实现的JSON库,实际测试的效果是,整个encode的效率提升了2倍多。

使用方法:

  • 安装:pip instal ujson

        >>> import ujson
        >>> ujson.dumps([{"key": "value"}, 81, True])
        '[{"key":"value"},81,true]'
        >>> ujson.loads("""[{"key": "value"}, 81, true]""")
        [{u'key': u'value'}, 81, True]
        

并不是所有情况下都适合

根据下面的BenchMark,在double数组的情况下,yajl的encode速度是比UltraJson的,所以,如果你的JSON文件较小的话,其实无所谓哪个库,如果是像我这样的大JSON文件,可以根据下面的表选择合适的JSON库。

BenchMark

下面是作者给出的benchmark:表格中的数字是每秒的调用次数,也就是说,数字越大,表示效率越高。

Versions:
  • CPython 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2]

  • blist : 1.3.6

  • simplejson: 3.8.1

  • ujson : 1.34 (0c52200eb4e2d97e548a765d5f089858c41967b0)

  • yajl : 0.3.5

 ujsonyajlsimplejsonjson
Array with 256 doubles   
encode3508.195742.003232.383309.09
decode25103.3711257.8311696.2611871.04
Array with 256 UTF-8 strings
encode3189.712717.142006.382961.72
decode1354.94630.54356.35344.05
Array with 256 strings   
encode18127.4712537.3912541.2320001.00
decode23264.7012788.8525427.889352.36
Medium complex object
encode10519.385021.293686.864643.47
decode9676.535326.798515.773017.30
Array with 256 True values
encode105998.03102067.2844758.5160424.80
decode163869.9678341.57110859.36115013.90
Array with 256 dict{string, int} pairs
encode13471.3212109.093876.408833.92
decode16890.638946.0712218.553350.72
Dict with 256 arrays with 256 dict{string, int} pairs
encode50.2546.4513.8229.28
decode33.2722.1027.9110.43
Dict with 256 arrays with 256 dict{string, int} pairs, outputting sorted keys
encode27.197.752.39
Complex object
encode577.98387.81470.02
decode496.73234.44151.00145.16
Versions:
  • CPython 3.4.3 (default, Oct 14 2015, 20:28:29) [GCC 4.8.4]

  • blist : 1.3.6

  • simplejson: 3.8.1

  • ujson : 1.34 (0c52200eb4e2d97e548a765d5f089858c41967b0)

  • yajl : 0.3.5

 ujsonyajlsimplejsonjson
Array with 256 doubles
encode3477.155732.243016.763071.99
decode23625.209731.459501.579901.92
Array with 256 UTF-8 strings
encode1995.892151.611771.981817.20
decode1425.04625.38327.14305.95
Array with 256 strings
encode25461.7512188.6413054.7614429.81
decode21981.3117014.2223869.4822483.58
Medium complex object
encode10821.464837.043114.044254.46
decode7887.775126.674934.606204.97
Array with 256 True values
encode100452.8694639.4246657.6360358.63
decode148312.6975485.9088434.91116395.51
Array with 256 dict{string, int} pairs
encode11698.138886.963043.696302.35
decode10686.407061.775646.807702.29
Dict with 256 arrays with 256 dict{string, int} pairs
encode44.2634.4310.4021.97
decode28.4623.9518.7022.83
Dict with 256 arrays with 256 dict{string, int} pairs, outputting sorted keys
encode33.606.9422.34
Complex object
encode432.30351.47379.34
decode434.40221.97149.57147.79

请移步我的博客了解更多

    原文作者:xiaochao
    原文地址: https://segmentfault.com/a/1190000010138782
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞