资讯专栏INFORMATION COLUMN

Python更快的解析JSON大文件

AlphaWallet / 3488人阅读

摘要:提出问题今天用的库解析一个的文件,发现一次都得要,这个在我开来,实在太慢了,有没有更快的库了先给出我的简单测试结果大小测试方法文件内容,然后一次一次解释器多无多多多不成熟的结论最快方法一自带的库是用纯代码实现的,而对纯代码的加速效果比较好。

提出问题

今天用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吧,很多文章解释的很好。

方法二: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

  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
请移步我的博客了解更多

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40627.html

相关文章

  • flask 源码解析:简介

    摘要:简介官网上对它的定位是一个微开发框架。另外一个必须理解的概念是,简单来说就是一套和框架应用之间的协议。功能比较丰富,支持解析自动防止攻击继承变量过滤器流程逻辑支持代码逻辑集成等等。那么,从下一篇文章,我们就正式开始源码之旅了 文章属于作者原创,原文发布在个人博客。 flask 简介 Flask 官网上对它的定位是一个微 python web 开发框架。 Flask is a micro...

    megatron 评论0 收藏0
  • 架构小试之IDL

    摘要:不合理的选型在后续维护上会带来不小的麻烦。因此一般公司会将所有服务的文件统一维护。生成的数据结构一般均支持序列化和反序列化,并且跨端跨语言。只支持,和数值三种结构,和支持相互嵌套,标准的的数值仅有这三种。只有大约的大小。本文转载自我自己的博客,感兴趣的老爷们可以关注~:https://www.miaoerduo.com/2021/11/16/arch-idl/为什么IDL的介绍也放在这里呢?...

    番茄西红柿 评论0 收藏2637
  • AJAX学习笔记 - 通讯格式

    摘要:本文章记录本人在深入学习中看书理解到的一些东西,加深记忆和并且整理记录下来,方便之后的复习。格式数据极其的冗长。但是使用格式还是可能比实际的数据占用更多的空间。该字符串通过或者转换为一个本地的对象。 本文章记录本人在深入学习Javascirpt AJAX中看书理解到的一些东西,加深记忆和并且整理记录下来,方便之后的复习。 避免使用 XML 没有哪种格式从始至终比其他格...

    番茄西红柿 评论0 收藏0
  • Python爬虫学习路线

    摘要:以下这些项目,你拿来学习学习练练手。当你每个步骤都能做到很优秀的时候,你应该考虑如何组合这四个步骤,使你的爬虫达到效率最高,也就是所谓的爬虫策略问题,爬虫策略学习不是一朝一夕的事情,建议多看看一些比较优秀的爬虫的设计方案,比如说。 (一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量、数据结构、语法...

    liaoyg8023 评论0 收藏0
  • <转> 从20秒到0.5秒:一个使用Rust语言来优化Python性能案例

    摘要:的在调查发现问题在于的性能缺陷后,我们决定尝试解析器的性能,这是为我们的工具编写的。这意味着即使忽略任何优化,只是将解析器替换为解析器就可以缓解我们的性能瓶颈。 注: 转自 微信公众号高可用架构:从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例 导读:Python 被很多互联网系统广泛使用,但在另外一方面,它也存在一些性能问题,不过 Sentry 工程师分享的在关...

    Kahn 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<