Python更快的解析JSON大文件

提出問題

今天用python的simplejson庫解析一個 >200MB 的JSON文件,發現一次decode/encode都得要 >10s,這個在我開來,實在太慢了,有沒有更快的庫了?python

先給出個人簡單測試結果

  • json大小:245MBjson

  • 測試方法:read文件內容,而後一次decode, 一次encode數組

解釋器 simplejson json ujson
pypy 40s多 10s
cpython 12s多 17s多 10s多
  • 不成熟的結論: pypy+json最快測試

方法一:pypy+json

python自帶的JSON庫是用純python代碼實現的,而pypy對純python代碼的加速效果比較好。至於爲何,你們能夠去google吧,不少文章解釋的很好。google

方法二:UltraJson

  • 我首先想到的用C庫來作JSON的解析,緣由你懂的,而C語言有個JSON庫叫CJSON,因而用python+cjson在google裏找到了UltraJsoncode

  • UltraJson是做者用C語言實現的JSON庫,實際測試的效果是,整個encode的效率提高了2倍多。ip

使用方法:

  • 安裝:pip instal ujsonget

    >>> 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:表格中的數字是每秒的調用次數,也就是說,數字越大,表示效率越高。string

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.00 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.00
decode 23264.70 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.30
Array with 256 True values
encode 105998.03 102067.28 44758.51 60424.80
decode 163869.96 78341.57 110859.36 115013.90
Array with 256 dict{string, int} pairs
encode 13471.32 12109.09 3876.40 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.10 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.00 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.20 9731.45 9501.57 9901.92
Array with 256 UTF-8 strings
encode 1995.89 2151.61 1771.98 1817.20
decode 1425.04 625.38 327.14 305.95
Array with 256 strings
encode 25461.75 12188.64 13054.76 14429.81
decode 21981.31 17014.22 23869.48 22483.58
Medium complex object
encode 10821.46 4837.04 3114.04 4254.46
decode 7887.77 5126.67 4934.60 6204.97
Array with 256 True values
encode 100452.86 94639.42 46657.63 60358.63
decode 148312.69 75485.90 88434.91 116395.51
Array with 256 dict{string, int} pairs
encode 11698.13 8886.96 3043.69 6302.35
decode 10686.40 7061.77 5646.80 7702.29
Dict with 256 arrays with 256 dict{string, int} pairs
encode 44.26 34.43 10.40 21.97
decode 28.46 23.95 18.70 22.83
Dict with 256 arrays with 256 dict{string, int} pairs, outputting sorted keys
encode 33.60 6.94 22.34
Complex object
encode 432.30 351.47 379.34
decode 434.40 221.97 149.57 147.79

請移步個人博客瞭解更多

相關文章
相關標籤/搜索