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


先给出我的简单测试结果


  • json大小:245MB

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


解释器 simplejson json ujson
pypy 40s多 10s
cpython 12s多 17s多 10s多

不成熟的结论: pypy+json最快


方法一:pypy+json 


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


方法二:UItraJson


我首先想到的用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



ujson yajl simplejson json
Array with 256 doubles



encode 3508.19 5742 3232.38 3309.09
decode 25103.37 11257.83 11696.26 11871.04
Array with 256 UTF-8 strings



encode 3189.71 2717.14 2006.38 2961.72
decode 1354.94 630.54 356.35 344.05
Array with 256 strings



encode 18127.47 12537.39 12541.23 20001
decode 23264.7 12788.85 25427.88 9352.36
Medium complex object



encode 10519.38 5021.29 3686.86 4643.47
decode 9676.53 5326.79 8515.77 3017.3
Array with 256 True values



encode 105998.03 102067.28 44758.51 60424.8
decode 163869.96 78341.57 110859.36 115013.9
Array with 256 dict{string, int} pairs



encode 13471.32 12109.09 3876.4 8833.92
decode 16890.63 8946.07 12218.55 3350.72
Dict with 256 arrays with 256 dict{string,  int} pairs



encode 50.25 46.45 13.82 29.28
decode 33.27 22.1 27.91 10.43
Dict with 256 arrays with 256 dict{string,  int} pairs, outputting sorted keys



encode 27.19
7.75 2.39
Complex object



encode 577.98
387.81 470.02
decode 496.73 234.44 151 145.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



ujson yajl simplejson json
Array with 256 doubles



encode 3477.15 5732.24 3016.76 3071.99
decode 23625.2 9731.45 9501.57 9901.92
Array with 256 UTF-8 strings



encode 1995.89 2151.61 1771.98 1817.2
decode 1425.04 625.38 327.14 305.95
Array with 256 strings



encode 25461.75 12188.6 13054.76 14429.81
decode 21981.31 17014.2 23869.48 22483.58
Medium complex object



encode 10821.46 4837.04 3114.04 4254.46
decode 7887.77 5126.67 4934.6 6204.97
Array with 256 True values



encode 100452.9 94639.4 46657.63 60358.63
decode 148312.7 75485.9 88434.91 116395.5
Array with 256 dict{string, int} pairs



encode 11698.13 8886.96 3043.69 6302.35
decode 10686.4 7061.77 5646.8 7702.29
Dict with 256 arrays with 256 dict{string,  int} pairs



encode 44.26 34.43 10.4 21.97
decode 28.46 23.95 18.7 22.83
Dict with 256 arrays with 256 dict{string,  int} pairs, outputting sorted keys



encode 33.6
6.94 22.34
Complex object



encode 432.3
351.47 379.34
decode 434.4 221.97 149.57 147.79


结尾

通过上面的这些步骤其实就可以解析JSON大文件了,是不是很简单呢?


原文链接:https://segmentfault.com/a/1190000010138782


课程推荐


Golang 实战班第2期火热报名进行中


招生要求:


有 Linux 基础,有志于使用 Go 语言做分布式系统编程的人员,想往系统架构师方向发展的同学。BAT 架构师带你一起飞。


课程内容:


  • Golang入门

  • Golang程序结构

  • Golang的基础数据类型

  • Golang复合数据类型

  • Golang的函数

  • Golang的方法

  • Golang的接口

  • Golang的协程和Channel

  • Golang基于共享变量的并发

  • Golang包和工具


上课模式:网络直播班    线下面授班


咨询报名联系:

QQ(1):979950755    小月   

QQ(2):279312229    ada   

WeChat : 1902433859   小月

WeChat : 1251743084   小单


开课时间10月14日(周六)


课程大纲http://51reboot.com/course/go