资讯专栏INFORMATION COLUMN

python中5个json库的速度对比

whjin / 1410人阅读

摘要:数据量较少时,速度几乎没有区别,无所谓选择哪一个。数据量大的情况下,的总体表现最好,但序列化不如而中,如果只是一个对象,可以直接使用用法为默认采用内置方式进格式化后返回。

python中json的序列化与反序列化有很多库,具体选择使用哪一个,或者哪一个速度更快呢?

先上结果

json序列化与反序列化速度对比(按总时间排序:测试数据100 * 10000)

ujson           序列化: 2.084    反序列化: 1.157      总时间: 3.241
yajl            序列化: 1.910    反序列化: 1.970      总时间: 3.880
cjson           序列化: 3.305    反序列化: 1.328      总时间: 4.632
simplejson      序列化: 10.279   反序列化: 4.658      总时间: 14.937
stdlib json     序列化: 7.013    反序列化: 8.594      总时间: 15.607

其中,除了stdlib json也就是内置的json.dumps外,其他都是第三方包。数据量较少时,速度几乎没有区别,无所谓选择哪一个。数据量大的情况下,ujson的总体表现最好,但序列化不如yajl

而django中,如果只是response一个json对象,可以直接使用JsonResonse

用法为:

>>> from django.http import JsonResponse
>>> response = JsonResponse({"foo": "bar"})
>>> response.content
"{"foo": "bar"}"

默认采用内置方式进json格式化后返回。如果数据不多,着实方便(django1.7引入)

测试代码

来自rtyler,在其基础上新增了ujson

import time

import pickle
import yajl

try:
    import cjson
except ImportError:
    cjson = None
try:
    import simplejson
except ImportError:
    simplejson = None
try:
    import ujson
except ImportError:
    ujson = None

try:
    import json
except ImportError:
    json = None

default_data = {
    "name": "Foo",
    "type": "Bar",
    "count": 1,
    "info": {
        "x": 203,
        "y": 102, }, }


def ttt(f, data=None, x=100 * 10000):
    start = time.time()
    while x:
        x -= 1
        foo = f(data)
    return time.time() - start


def profile(serial, deserial, data=None, x=100 * 10000):
    if not data:
        data = default_data
    squashed = serial(data)
    return (ttt(serial, data, x), ttt(deserial, squashed, x))


def test(serial, deserial, data=None):
    if not data:
        data = default_data
    assert deserial(serial(data)) == data


contenders = [
    ("yajl", (yajl.Encoder().encode, yajl.Decoder().decode)),
]
if cjson:
    contenders.append(("cjson", (cjson.encode, cjson.decode)))
if simplejson:
    contenders.append(("simplejson", (simplejson.dumps, simplejson.loads)))
if json:
    contenders.append(("stdlib json", (json.dumps, json.loads)))
if ujson:
    contenders.append(("ujson", (ujson.dumps, ujson.loads)))

for name, args in contenders:
    test(*args)
    x, y = profile(*args)
    print("%-11s serialize: %0.3f  deserialize: %0.3f  total: %0.3f" % (
        name, x, y, x + y))

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

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

相关文章

  • Python3网络爬虫实战---12、部署相关库的安装:Docker、Scrapyd

    摘要:阿里云安装脚本安装脚本两个脚本可以任选其一,速度都非常不错。推荐的加速器有和阿里云。阿里云不同平台的镜像加速方法配置可以参考的官方文档。以上便是的安装方式说明。上一篇文章网络爬虫实战爬虫框架的安装下一篇文章网络爬虫实战部署相关库 上一篇文章:Python3网络爬虫实战---11、爬虫框架的安装:ScrapySplash、ScrapyRedis下一篇文章:Python3网络爬虫实战---...

    ityouknow 评论0 收藏0
  • python 和 ruby的对比

    摘要:的解析器实现更成熟,第三方库质量高解析器尽管已经有了很大的性能提升和很多新的功能,但是从源代码实现的角度来说,基本上是通过在源代码上打来增加功能的。相对而言,解析器更成熟,也比较稳定。 最近在考虑学习一门后端语言,在ruby和python直接犹豫,然后自己做了一些对比,希望能帮到有同样问题的你。 一、异同对比选择1、Python和ruby的相同点: 都强调语法简单,都具有更一般的表达...

    ghnor 评论0 收藏0
  • 一文看懂npm、yarn、pnpm之间的区别

    摘要:请注意,在版本号之前有个字符。理论上,次版本号的变化并不会影响向后兼容性。虽然可以通过命令关闭在版本号前面使用的默认行为,但这个只会影响顶级依赖关系。 本文作者对比了当前主流的包管理工具npm、yarn、pnpm之间的区别,并提出了合适的使用建议,以下为译文: NPM npm是Node.js能够如此成功的主要原因之一。npm团队做了很多的工作,以确保npm保持向后兼容,并在不同的环境中...

    zgbgx 评论0 收藏0
  • Python3网络爬虫实战---29、解析库的使用:BeautifulSoup

    摘要:解析器在解析的时候实际上是依赖于解析器的,它除了支持标准库中的解析器,还支持一些第三方的解析器比如,下面我们对支持的解析器及它们的一些优缺点做一个简单的对比。 上一篇文章:Python3网络爬虫实战---28、解析库的使用:XPath下一篇文章:Python3网络爬虫实战---30、解析库的使用:PyQuery 前面我们介绍了正则表达式的相关用法,但是一旦正则写的有问题,可能得到的就...

    MockingBird 评论0 收藏0

发表评论

0条评论

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