设为首页 收藏本站
查看: 1004|回复: 0

[经验分享] Python更快的解析JSON大文件

[复制链接]

尚未签到

发表于 2018-8-9 06:56:08 | 显示全部楼层 |阅读模式
  今天用python的simplejson库解析一个 >200MB 的JSON文件,发现一次decode/encode都得要 >10s,这个实在太慢了,有没有更快的库了?
  先给出我的简单测试结果
  

  •   json大小:245MB
  •   测试方法:read文件内容,然后一次decode, 一次encode
解释器simplejsonjsonujsonpypy40s多10s无cpython12s多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
ujsonyajlsimplejsonjsonArray with 256 doublesencode3508.1957423232.383309.09decode25103.3711257.8311696.2611871.04Array with 256 UTF-8 stringsencode3189.712717.142006.382961.72decode1354.94630.54356.35344.05Array with 256 stringsencode18127.4712537.3912541.2320001decode23264.712788.8525427.889352.36Medium complex objectencode10519.385021.293686.864643.47decode9676.535326.798515.773017.3Array with 256 True valuesencode105998.03102067.2844758.5160424.8decode163869.9678341.57110859.36115013.9Array with 256 dict{string, int} pairsencode13471.3212109.093876.48833.92decode16890.638946.0712218.553350.72Dict with 256 arrays with 256 dict{string,  int} pairsencode50.2546.4513.8229.28decode33.2722.127.9110.43Dict with 256 arrays with 256 dict{string,  int} pairs, outputting sorted keysencode27.197.752.39Complex objectencode577.98387.81470.02decode496.73234.44151145.16Versions:

  •   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
ujsonyajlsimplejsonjsonArray with 256 doublesencode3477.155732.243016.763071.99decode23625.29731.459501.579901.92Array with 256 UTF-8 stringsencode1995.892151.611771.981817.2decode1425.04625.38327.14305.95Array with 256 stringsencode25461.7512188.613054.7614429.81decode21981.3117014.223869.4822483.58Medium complex objectencode10821.464837.043114.044254.46decode7887.775126.674934.66204.97Array with 256 True valuesencode100452.994639.446657.6360358.63decode148312.775485.988434.91116395.5Array with 256 dict{string, int} pairsencode11698.138886.963043.696302.35decode10686.47061.775646.87702.29Dict with 256 arrays with 256 dict{string,  int} pairsencode44.2634.4310.421.97decode28.4623.9518.722.83Dict with 256 arrays with 256 dict{string,  int} pairs, outputting sorted keysencode33.66.9422.34Complex objectencode432.3351.47379.34decode434.4221.97149.57147.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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-548820-1-1.html 上篇帖子: python paramiko模块简介 下篇帖子: python管理DNS-muzinan的技术博客
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表