侵权投诉

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 处理 JSON 我选择 ujson 和 orjson

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

收藏 人收藏
分享:

评论

相关推荐

DTU在废品智能回收系统中的应用

1.概述 废品智能回收系统要实现的功能描述: 可回收物:可投放到智能垃圾分类回收箱的大致有这五大品类....
发表于 10-21 18:02 52次 阅读
DTU在废品智能回收系统中的应用

开关电源拓扑图一览

2019独角兽企业重金招聘Python工程师标准>>> ....
发表于 10-21 17:36 7次 阅读
开关电源拓扑图一览

嵌入式Python环境

本文首发于just4fun缘起这里将讨论的嵌入式Python环境并不是硬件嵌入式开发的那个嵌入式,如....
发表于 10-21 11:21 9次 阅读
嵌入式Python环境

嵌入式c语言 c语言_C和嵌入式C有什么区别?

嵌入式c语言 c语言C programming language was designed by t....
发表于 10-21 10:21 7次 阅读
嵌入式c语言 c语言_C和嵌入式C有什么区别?

嵌入式的上位机界面测试例子

在开发嵌入式软件时,经常要使用一些界面测试例子,如果让别人帮忙开发,当然是比较好的事情,但是在小公司....
发表于 10-20 19:51 6次 阅读
嵌入式的上位机界面测试例子

Python 中常见的配置文件写法有哪些

  为什么要写配置文件 在开发过程中,我们常常会用到一些固定参数或者是常量。对于这些较为固定且常用到....
的头像 马哥Linux运维 发表于 10-20 16:11 228次 阅读
Python 中常见的配置文件写法有哪些

简述Python加速运行小窍门

Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足。但是,....
的头像 Linux爱好者 发表于 10-20 15:28 714次 阅读

一文汇总并发http请求最快的几种实现方式用

假如有一个文件,里面有 10 万个 url,需要对每个 url 发送 http 请求,并打印请求结果....
的头像 Linux爱好者 发表于 10-20 14:36 113次 阅读
一文汇总并发http请求最快的几种实现方式用

浅析Python数据结构与算法

Python数据结构是由哪些部分组成的?
发表于 10-20 06:43 0次 阅读

python是如何实现hbase增删改查的

hbase shell是怎样去创建命名空间的? python是如何实现hbase增删改查的?求解 ...
发表于 10-19 07:26 0次 阅读

关于Python18个你不知道的高效编程技巧

初识Python语言,觉得python满足了我上学时候对编程语言的所有要求。python语言的高效编....
的头像 马哥Linux运维 发表于 10-15 11:23 278次 阅读

用Python实现3D地图教程

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题....
的头像 马哥Linux运维 发表于 10-13 10:09 207次 阅读
用Python实现3D地图教程

关于Python对交通路口的红绿灯进行颜色检测

转自 |   Python联盟 1.视频读取 首先把视频读取进来,因为我测试的视频是4k的所以我用r....
的头像 新机器视觉 发表于 10-13 09:32 272次 阅读
关于Python对交通路口的红绿灯进行颜色检测

如何制作数据可视化大屏

经常有小伙伴问,如何制作数据可视化大屏? 今天将手把手带你爬取奥运会相关信息,并利用 可视化大屏 为....
的头像 Linux爱好者 发表于 10-12 16:31 185次 阅读
如何制作数据可视化大屏

什么是MicroPython 它能做什么有什么局限

随着Python成为主流的编程语言,MicroPython在嵌入式系统领域也越来越热门起来,尤其是大....
的头像 电子森林 发表于 10-12 11:44 282次 阅读

10具有挑战性的Python项目创意

你知道 Python 是被称为 全能编程语言 的吗?是的,它确实是,虽然不应该在每个项目中都使用它。....
的头像 Android编程精选 发表于 10-12 10:43 316次 阅读

如何把Python和Excel两大数据工具进行集成

  这次我们会介绍如何使用xlwings将Python和Excel两大数据工具进行集成,更便捷地处理....
的头像 数据分析与开发 发表于 10-12 09:41 192次 阅读
如何把Python和Excel两大数据工具进行集成

如何在Colab中使用SQL

如今,编码测试在数据科学面试过程中几乎是标准的。 作为一名数据科学招聘经理,我发现一个20-30分钟....
的头像 智能感知与物联网技术研究所 发表于 10-12 09:39 213次 阅读
如何在Colab中使用SQL

Python开发中Pycharm的实用小技巧

  Pycharm作为Python开发最常用的IDE之一,不仅兼容性好,而且功能也相当丰富,比如调试....
的头像 马哥Linux运维 发表于 10-12 09:36 181次 阅读

Python的时间处理模块中处理日期与时间的全面总结

Python的时间处理模块在日常的使用中用的较多,但是使用的时候基本上都是要查资料,还是有些麻烦的,....
的头像 马哥Linux运维 发表于 10-12 09:24 235次 阅读
Python的时间处理模块中处理日期与时间的全面总结

Python中最常用的几种线程锁你会用吗

前言本文将继续围绕 threading 模块讲解,基本上是纯理论偏多。 对于日常开发者来讲很少会使用....
的头像 马哥Linux运维 发表于 10-11 16:07 181次 阅读

优秀的 Verilog/FPGA开源项目介绍(一)

优秀的 Verilog/FPGA开源项目介绍(一)-PCIe通信 今天开始会陆续介绍一些优秀的开源项....
的头像 OpenFPGA 发表于 10-11 15:31 350次 阅读
优秀的 Verilog/FPGA开源项目介绍(一)

Python入门知识汇总

Python代码生成EXE文件的方法是什么?
发表于 10-11 06:00 0次 阅读

Python版test1实战说明

上一篇文章已经带着大家安装 DeepStream 的 Python 开发环境,并且执行最简单的 de....
的头像 NVIDIA英伟达企业解决方案 发表于 10-09 14:28 177次 阅读

教你们如何用 Python 快速制作海报级地图附代码

 1 简介 基于 Python 中诸如 matplotlib 等功能丰富、自由度极高的绘图库,我们可....
的头像 Linux爱好者 发表于 10-09 11:36 286次 阅读

什么是Python中的流程控制?

什么是Python中的流程控制?
发表于 10-09 07:24 0次 阅读

Python定时任务的实现方式

在日常工作中,我们常常会用到需要周期性执行的任务,一种方式是采用 Linux 系统自带的 crond....
的头像 马哥Linux运维 发表于 10-08 15:20 1347次 阅读

Python的矩阵传播机制

一、Python的矩阵传播机制(Broadcasting) 我们知道在深度学习中经常要操作各种矩阵(....
的头像 Linux爱好者 发表于 09-30 16:53 334次 阅读

Python提供了几个级别访问的网络服务呢

Python提供了几个级别访问的网络服务呢?
发表于 09-30 08:09 0次 阅读

如何用python实现贪吃蛇游戏

贪吃蛇 具体实现部分,大致分为三个模块来介绍:游戏初始化、游戏运行(蛇移动、吃掉食物)、游戏结束 1....
的头像 马哥Linux运维 发表于 09-29 18:05 485次 阅读
如何用python实现贪吃蛇游戏

如何才能保证JWT安全

jwt是什么? JWTs是JSON对象的编码表示。JSON对象由零或多个名称/值对组成,其中名称为字....
的头像 Android编程精选 发表于 09-29 15:09 229次 阅读

python导出excel格式的oracle数据报表讲解

python导出excel格式的oracle数据报表讲解(通信电源技术期刊官网)-该文档为pytho....
发表于 09-28 13:10 32次 阅读
python导出excel格式的oracle数据报表讲解

在鸿蒙上使用Python进行物联网编程

在上一篇帖子《使用 Python 开发鸿蒙设备程序(1-GPIO 外设控制)》中,已经成功的使用 P....
的头像 HarmonyOS技术社区 发表于 09-28 09:55 521次 阅读
在鸿蒙上使用Python进行物联网编程

怎样去实现一种基于Python的OPC UA编程

怎样去实现一种基于Python的OPC UA编程? 如何通过FreeOpcUa创建自己的地址空间? ...
发表于 09-28 09:35 0次 阅读

用Python完成鸿蒙开发板外设控制

话说很久以前,我将 MicroPython 的解释器给“挖”了出来,然后做了适配,成功运行于鸿蒙设备....
的头像 HarmonyOS技术社区 发表于 09-28 09:22 358次 阅读

请问如何选择合适机械的伺服电机?

请问如何选择合适机械的伺服电机?
发表于 09-27 07:57 0次 阅读

pandas筛选数据的8个小技巧

  日常用 Python 做数据分析最常用到的就是查询筛选了,按各种条件、各种维度以及组合挑出我们想....
的头像 数据分析与开发 发表于 09-26 11:04 1180次 阅读
pandas筛选数据的8个小技巧

Python连接Oracle数据库

Python连接Oracle数据库(深圳市核达中远通电源技术股份有限公司招聘)-该文档为Python....
发表于 09-24 17:20 33次 阅读
Python连接Oracle数据库

深刻理解Python中的元类(metaclass)

深刻理解Python中的元类(metaclass)(大工20春电源技术在线作业2)-该文档为深刻理解....
发表于 09-24 16:12 28次 阅读
深刻理解Python中的元类(metaclass)

分享Python 流畅的Python

目录: 第一部分 序幕 第 1 章 Python 数据模型 1.1 一摞Python风格的纸牌 1.2 如何使用特殊方法 1.2.1 模拟数值...
发表于 09-23 20:39 1111次 阅读
分享Python 流畅的Python

Python后端项目的协程是什么

最近公司 Python 后端项目进行重构,整个后端逻辑基本都变更为采用“异步”协程的方式实现。看着满....
的头像 Linux爱好者 发表于 09-23 14:38 299次 阅读

如何利用Python语言来控制电机

如何利用Python语言来控制电机? 如何利用L298N驱动板来控制电机? ...
发表于 09-22 08:32 0次 阅读

初学者如何去选择一种编程语言

Python是什么?JavaScript有何优点? 对于初学者什么是最好的编程语言?...
发表于 09-22 06:26 0次 阅读

在Anaconda中安装python包seaborn

在Anaconda中安装python包seaborn(现代电源技术题库)-在Anaconda中安装p....
发表于 09-18 15:01 36次 阅读
在Anaconda中安装python包seaborn

Python科学计算利器Anaconda

Python科学计算利器Anaconda(开关电源技术毕业设计)-Python科学计算利器Anaco....
发表于 09-18 14:26 39次 阅读
Python科学计算利器Anaconda

如何使用工业树莓派做ython的PWM控制

虹科工业树莓派 准备工作 硬件: 虹科工业树莓派1台 DIO模块1个 Windows系统电脑1台 L....
的头像 广州虹科电子科技有限公司 发表于 09-16 10:57 2043次 阅读
如何使用工业树莓派做ython的PWM控制

基于Python-casacore的射电测量集文件生成方法

基于Python-casacore的射电测量集文件生成方法(开关电源技术试卷)-该文档为基于Pyth....
发表于 09-15 13:11 40次 阅读
基于Python-casacore的射电测量集文件生成方法

符合IEPE标准的CbM机器学习赋能平台

CbM需要捕获全带宽数据,以确保时域和频域中的所有谐波、混叠及其他机械相互作用都得到考虑。这种数据收....
发表于 09-13 12:45 3926次 阅读
符合IEPE标准的CbM机器学习赋能平台

如何通过Python脚本实现WIFI密码的暴力破解

前言 本文将记录学习下如何通过 Python 脚本实现 WIFI 密码的暴力破解,从而实现免费蹭网。....
的头像 马哥Linux运维 发表于 09-10 17:09 752次 阅读
如何通过Python脚本实现WIFI密码的暴力破解

如何在环境安装使用Python操作word

作者丨超级大洋葱806 https://tangxing.blog.csdn.net/article....
的头像 Android编程精选 发表于 09-05 15:13 535次 阅读
如何在环境安装使用Python操作word

如何利用Python抓取用户发的话题

大多数APP里面返回的是json格式数据,或者一堆加密过的数据 。这里以超级课程表APP为例,抓取超....
的头像 马哥Linux运维 发表于 09-05 09:37 310次 阅读
如何利用Python抓取用户发的话题

分享一个最新的的Python对象序列化方式

许多Python标准库都有一些未被赏识的精华。其中之一是允许简单优雅的基于参数类型的函数分发。这一特....
的头像 马哥Linux运维 发表于 09-01 15:19 1079次 阅读
分享一个最新的的Python对象序列化方式

jsonpath库中的常规功能介绍

1 简介 在日常使用Python的过程中,我们经常会与json格式的数据打交道,尤其是那种嵌套结构复....
的头像 Linux爱好者 发表于 09-01 14:11 291次 阅读
jsonpath库中的常规功能介绍

Python 代码加速运行的的小技巧

Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足。但是,....
的头像 Android编程精选 发表于 09-01 11:28 375次 阅读

如何过滤掉MySQL大批量插入的重复数据

线上库有6个表存在重复数据,其中2个表比较大,一个96万+、一个30万+,因为之前处理过相同的问题,....
的头像 阿铭linux 发表于 08-27 11:00 383次 阅读

基于Rust基础上如何去编写一个Linux内核模块

编者按:近些年来 Rust 语言由于其内存安全性和性能等优势得到了很多关注,尤其是 Linux 内核....
的头像 开关电源芯片 发表于 08-27 09:59 1357次 阅读

女友让翻译化妆品标签 看大佬如何用Python轻松解决

最近小编遇到一个生存问题,女朋友让我给她翻译英文化妆品标签。美其名曰:“程序猿每天英语开发,英文一定....
的头像 阿铭linux 发表于 08-25 17:27 360次 阅读

利用Python和PyTorch处理面向对象的数据集

本篇是利用 Python 和 PyTorch 处理面向对象的数据集系列博客的第 2 篇。 如需阅读第....
的头像 FPGA开发圈 发表于 08-25 15:30 1485次 阅读