0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python中三个json组件的安装方式

马哥Linux运维 来源:博客 作者:隔叶黄莺 2021-09-23 14:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Python 使用用 json.dumps(data) 时突然发现特别慢,data 本身不大,但是一个包含很多元素的列表,所以促使本人寻找一个替代的 JSON 处理库。大概对比了一个 ujson(UtltraJSON), python-rapidjson(RapidJSON) 和 Python 自带的 json 库。还有一个 simplejson 是为兼容 Python 2.6 以前用的(json 是 Python 2.6 新加入的 API),性能有些差。基本上姜还是老的辣,想要收获更好的性能,还得仰赖传统的 C/C++ 语言,ujson 是用纯 C 写的,RapidJSON 是 C++ 写的,后者还是十美分的开源产品。json, ujson, rapidjson 三者 loads() 方法的性能差别不太明显,但 dumps() 大对象时 Python 自带的 json 库就要考验用户的耐心了。注:最开始本来认定了 ujson 为最佳选择, 所以先从 usjon 和 rapidjson 切入的,后来写作本文的过程中,从 usjon 的自我介绍中发现了 Rust 写的 orjson 很显眼,才加入了 orjson 的测试,看来 orjson 更值得拥有。以上三个 json 组件的安装方式分别为

pip install python-rapidjson

$ pip install simplejson

自己测试了一个 ujson 和 rapidjson 与 Python json 库的 dumps() 的性能,simpejson 不太考虑了。测试代码如下

# test.py

from time import timeimport sysimport string

num = int(sys.argv[1])lib = sys.argv[2]

items = []for i in range(num): items.append({c:c for c in string.ascii_letters})start = time()if lib == ‘ujson’: import ujson ujson.dumps(items)elif lib == ‘rapidjson’: import rapidjson rapidjson.dumps(items)else: import json json.dumps(items)

print(time() - start)

执行 python 1000|10000|100000|1000000 json|ujson|rapidjson, 试结果统计如下(数字为不同情况下的耗时):

31709712-0fb2-11ec-8fb8-12bb97331649.png

基本上测试的性能和 Benchmark of Python JSON libraries 中的是一致的。从原文中截取了两张图如下:

317e661c-0fb2-11ec-8fb8-12bb97331649.png

在 UltraJSON 的 Github 项目页面中也有对比 ujson, nujson, orjson, simplejson, json 的 Benchmarks。其中列出的 orjson(pip install orjson) 和 nujson(pip install nujson, Fork 了 UltraJSON 来支持 Numpy 序列化的) 性能表现上不错,orjson 表现上比 ujson 还更为卓越。

看到了 orjson 后,赶紧做个对比测试,在上面的 test.py 代码中再加上

elif lib == ‘orjson’: import orjson orjson.dumps(items)

再列出完整的对比数据

319ddc4a-0fb2-11ec-8fb8-12bb97331649.png

继续翻看 orjson 的 Github 主页面 ijl/orjson, 它既非用 C 也不是用 C++ 写的,而是 Rust 语言,真是让我眼前一亮,Rust 程序运行速度真的能与 C/C++ 相媲美的。写到这里我要开始改变当初只认 ujson 的主意了,orjson 或许是更佳的选择, 本文的标题也由最初拟定的 “Python 处理 JSON 必要时我选择 ujson(UltraJSON)” 变成了 “Python 处理 JSON 必要时我选择 ujson 和 orjson”。这也是写博客时,尽可能收集更多的素材多的魅力。

补充一下,orjson 的 dumps() 函数使用略有不同,不再用 indent 参数,并且返回值是 bytes,所以格式化成字符串的写法如下

import orjson

json_str = orjson.dumps(record, option=orjson.OPT_INDENT_2).decode()

另外,在使用 ujson 时碰到的一个 bug 也顺便记录在此,就不立新篇了,反正现在找东西都不太看标题,而是 Google 到其中的内容。ujson 3.0.0 和 3.1.0 版本的 dumps() 的 indent 参数工作不正常,有个未关闭的 ticket ‘indent’ parameter for dumps doesn‘t indent properly in 3.0.0 #415。比如使用 ujson 3.1.0 时的现像是

》》》 import ujson》》》 ujson.dumps({’a‘: 1, ’b‘: 2})’{“a”:1,“b”:2}‘

》》》 ujson.dumps({’a‘: 1, ’b‘: 2}, indent=0)’{“a”:1,“b”:2}‘

》》》 ujson.dumps({’a‘: 1, ’b‘: 2}, indent=1)’{

“a”: 1,

“b”: 2

}‘

》》》 ujson.dumps({’a‘: 1, ’b‘: 2}, indent=2)’{

“a”: 1,

“b”: 2

}‘

》》》 ujson.dumps({’a‘: 1, ’b‘: 2}, indent=8)’{

“a”: 1,

“b”: 2

}‘

indent 大于 1 时都当作 1。

换回到 ujson 2.0.3 版本时没问题

》》》 import ujson》》》 ujson.dumps({’a‘: 1, ’b‘: 2}, indent=2)’{

“a”: 1,

“b”: 2

}‘

》》》 ujson.dumps({’a‘: 1, ’b‘: 2}, indent=8)’{

“a”: 1,

“b”: 2

}‘

在这个问题未解决之前就暂时用 pip install ujson==2.0.3 安装 ujson 2.0.3 吧,但是这个版本无法序列化 datetime 类型。

原文链接:https://yanbin.blog/python-json-choose-ujson-if-necessary/

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    58

    文章

    4885

    浏览量

    90310
  • JSON
    +关注

    关注

    0

    文章

    129

    浏览量

    7810

原文标题:Python 处理 JSON 我选择 ujson 和 orjson

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    [VirtualLab] 使用Python运行VirtualLab Fusion光学仿真

    使用代码编辑器Visual Studio Code(VS Code),因为它提供了一用户友好的安装工作流程*。当然,如果需要,也可以使用其他Python编辑器。 对于使用VS Code的用户: 1.1
    发表于 03-31 09:39

    如何在 Vision Five 2 上安装 python 库?

    这可能是一完全愚蠢的问题,但我如何在 Vision Five 2 上安装 python 库。 使用该命令后,它给了我这个错误。 默认为用户安装,因为普通站点包不可写 错误:找不到满足
    发表于 03-06 07:51

    定华雷达仪表学堂:不适合安装雷达物位计的三个位置

    物位计测量准确、运行稳定,安装位置的选择至关重要。以下是三个不适宜安装的位置及具体原因分析: 1. 远离进料口 原因:进料口附近物料流动剧烈,容易产生漩涡、气泡或粉尘,这些都会对雷达波的正常传播与反射造成干扰,导致
    的头像 发表于 02-26 13:47 214次阅读

    JSON:简洁代码高效搞定序列化与反序列化

    面对频繁的数据交互需求,用最简方式实现JSON序列化与反序列化已成为开发者必备技能,借助主流库,轻松实现零负担数据转换。JSON(JavaScriptObjectNotation)是一种轻量级
    的头像 发表于 02-25 19:04 245次阅读
    <b class='flag-5'>JSON</b>:简洁代码高效搞定序列化与反序列化

    极简代码,搞定JSON序列化与反序列化

    LuatOS开发中,使用以下两函数高效处理JSON数据。 1.1  两关键函数 1)json.encode(obj,t) 功能是将Lua对象序列化为
    的头像 发表于 02-23 21:46 443次阅读
    极简代码,搞定<b class='flag-5'>JSON</b>序列化与反序列化

    安装 Python VisionFive_GPIO失败是哪里出了问题?

    尽管按照最新的文档,我在安装 VisionFive.gpio 包时仍然收到错误 sudo apt 安装 libxml2-dev libxslt-dev python3 -m pip 安装
    发表于 02-11 06:13

    三个经典开关电源实际问题解析

    下面三个关于多路输出电源连续工作模式的问题,测试一下您的电源设计知识。然后核对您的答案。
    的头像 发表于 01-22 16:08 3508次阅读
    <b class='flag-5'>三个</b>经典开关电源实际问题解析

    MDD从工程故障看极管三个极的设计误区与失效案例

    一、为什么极管问题总是“看起来很随机”?在FAE现场支持中,经常遇到如下问题:-同一电路,有的板子正常,有的异常-高温下工作不稳定-更换批次后性能漂移这些问题,90%都与三个极的设计与使用方式有关
    的头像 发表于 01-19 11:48 355次阅读
    MDD从工程故障看<b class='flag-5'>三</b>极管<b class='flag-5'>三个</b>极的设计误区与失效案例

    束管式光缆最简单三个步骤

    束管式光缆的安装或施工可简化为以下三个核心步骤,确保光纤传输性能稳定且操作高效: 第一步:路由规划与准备 路径勘察 确定光缆敷设路线,避开强电磁干扰源(如高压线)、尖锐物体或易受外力破坏的区域(如
    的头像 发表于 01-07 10:12 469次阅读

    详解DBC的Signal与JSON文本结合

    为了优化CAN数据发送与接收的操作流程,更改以前手动输入状态对应数据的模式,采用下拉列表选择内容,但这需要用到超出DBC原有承载能力的信息。因此,将JSON与其结合,采用JSON格式文本写入Signal的Comment属性,将Comment属性的字符串通过
    的头像 发表于 01-06 10:57 426次阅读
    详解DBC的Signal与<b class='flag-5'>JSON</b>文本结合

    Termux中调试圣诞树Python代码

    在Termux中调试Python代码(以圣诞树立例)非常简单,核心分为环境准备、代码编写、运行调试三个步骤,下面一步步教你操作: 一、环境准备(首次使用需做) Termux默认可能没有Python
    发表于 12-09 09:02

    未来工业AI发展的三个必然阶段

    与优化 能力的深层革命。 未来十年,工业AI的发展将经历三个清晰的阶段:  智能辅助 → 智能决策 → 自主优化 。这次进化,构成了工业从“人控机器”到“机器共智”的核心路径。 一、第一阶段:智能辅助(AI for Assistance) 时间窗口:
    的头像 发表于 10-27 15:47 603次阅读
    未来工业AI发展的<b class='flag-5'>三个</b>必然阶段

    MA35-RTT如何安装 Python 和 Libusb (Windows) ?

    MA35-RTT:如何安装 Python 和 Libusb (Windows) ?
    发表于 09-03 08:30

    termux如何搭建python游戏

    模拟器,支持通过APT包管理器安装软件。搭建Python游戏开发环境前需完成以下基础配置: 1. 更换国内源 为提升下载速度,需替换Termux默认源为清华源,执行以下命令: ```bash
    发表于 08-29 07:06

    迅为RK3568开发板编写bundle.json文件

    :led_test\"] - 构建时包含的子组件路径,这里指定了一具体的构建目标。 这个 JSON 配置文件提供了关于如何构建、部署和管理这个名为\"demos\"的组件的详细信息。
    发表于 06-05 15:38