(数据科学学习手札137)orjson:Python中最好用的json库
本文示例代码及文件已上传至我的
Github
仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
大家好我是费老师,我们在日常使用Python
的过程中,经常会使用json
格式存储一些数据,尤其是在web
开发中。而Python
原生的json
库性能差、功能少,只能堪堪应对简单轻量的json
数据存储转换需求。
而本文我要给大家介绍的第三方json
库orjson
,在公开的各项基准性能测试中,以数倍至数十倍的性能优势碾压json
、ujson
、rapidjson
、simplejson
等其他Python
库,且具有诸多额外功能,下面我们就来领略其常用方法吧~
2 orjson常用方法
orjson
支持3.7
到3.10
所有版本64位的Python
,本文演示对应的orjson
的版本为3.7.0
,直接使用pip install -U orjson
即可完成安装。下面我们来对orjson
中的常用方法进行演示:
2.1 序列化
与原生json
库类似,我们可以使用orjson.dumps()
将Python
对象序列化为JSON
数据,注意,略有不同的是,orjson
序列化的结果并不是str
型而是bytes
型,在下面的例子中,我们对包含一千万个简单字典元素的列表进行序列化,orjson
与json
库的耗时比较如下:
2.2 反序列化
将JSON
数据转换为Python
对象的过程我们称之为反序列化,使用orjson.loads()
进行操作,可接受bytes
、str
型等常见类型,在前面例子的基础上我们添加反序列化的例子:
2.3 丰富的option选项
在orjson
的序列化操作中,可以通过参数option
来配置诸多额外功能,常用的有:
- OPT_INDENT_2
通过配置option=orjson.OPT_INDENT_2
,我们可以为序列化后的JSON
结果添加2个空格的缩进美化效果,从而弥补其没有参数indent
的不足:
- OPT_OMIT_MICROSECONDS
orjson.dumps()
可以直接将Python
中datetime
、time
等标准库中的日期时间对象转换成相应的字符串,这是原生json
库做不到的,而通过配置option=orjson.OPT_OMIT_MICROSECONDS
,可以将转换结果后缀的毫秒部分省略掉:
- OPT_NON_STR_KEYS
当需要序列化的对象存在非数值型键时,orjson
默认会抛出TypeError
错误,这时需要配置option=orjson.OPT_NON_STR_KEYS
来强制将这些键转换为字符型:
- OPT_SERIALIZE_NUMPY
orjson
的一大重要特性是其可以将包含numpy
中数据结构对象的复杂对象,兼容性地转换为JSON
中的数组,配合option=orjson.OPT_SERIALIZE_NUMPY
即可:
- OPT_SERIALIZE_UUID
除了可以自动序列化numpy
对象外,orjson
还支持对UUID
对象进行转换,在orjson 3.0
之前的版本中,需要配合option=orjson.OPT_SERIALIZE_UUID
,而本文演示的3.X
版本则无需额外配置参数:
- OPT_SORT_KEYS
通过配合参数option=orjson.OPT_SORT_KEYS
,可以对序列化后的结果自动按照键进行排序:
- 组合多种option
当你的序列化操作需要涉及多种option
功能时,则可以使用|
运算符来组合多个option
参数即可:
2.4 针对dataclass、datetime添加自定义处理策略
当你需要序列化的对象中涉及到dataclass
自定义数据结构时,可以配合orjson.OPT_PASSTHROUGH_DATACLASS
,再通过对default
参数传入自定义处理函数,来实现更为自由的数据转换逻辑,譬如下面简单的例子中,我们可以利用此特性进行原始数据的脱敏操作:
类似的,针对datetime
类型数据,我们同样可以配合OPT_PASSTHROUGH_DATETIME
和自定义default
函数实现日期自定义格式化转换:
orjson
更多特性可前往官方仓库https://github.com/ijl/orjson
了解更多~
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
(数据科学学习手札137)orjson:Python中最好用的json库的更多相关文章
- (数据科学学习手札32)Python中re模块的详细介绍
一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...
- (数据科学学习手札126)Python中JSON结构数据的高效增删改操作
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...
- (数据科学学习手札136)Python中基于joblib实现极简并行计算加速
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在日常使用Python进行各种数据计算 ...
- (数据科学学习手札53)Python中tqdm模块的用法
一.简介 tqdm是Python中专门用于进度条美化的模块,通过在非while的循环体内嵌入tqdm,可以得到一个能更好展现程序运行过程的提示进度条,本文就将针对tqdm的基本用法进行介绍. 二.基本 ...
- (数据科学学习手札54)Python中retry的简单用法
一.简介 retry是一个用于错误处理的模块,功能类似try-except,但更加快捷方便,本文就将简单地介绍一下retry的基本用法. 二.基本用法 retry: 作为装饰器进行使用,不传入参数时功 ...
- (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图
本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...
- (数据科学学习手札49)Scala中的模式匹配
一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...
- (数据科学学习手札109)Python+Dash快速web应用开发——静态部件篇(中)
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
- (数据科学学习手札118)Python+Dash快速web应用开发——特殊部件篇
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
随机推荐
- 界面跳转+Android Studio Button事件的三种方式
今天学习界面跳转 java类总是不能新建成功 看了网上教程 (20条消息) 关于android studio无法创建类或者接口问题的解决方法_qq_39916160的博客-CSDN博客 可以新建了 但 ...
- JavaScript 中 empty、remove 和 detach的区别
内容 empty.remove 和 detach的区别 jQuery 操作 DOM 之删除节点 方法名 元素所绑定的事件及数据是否也被移除 作用 $(selector).empty() 是 从被选元素 ...
- 用 JS(JavaScript )实现增删改查
JS小例题 学习内容: 需求 总结: 学习内容: 需求 用 JavaScript 实现简单增删改查 实现代码 <!DOCTYPE html PUBLIC "-//W3C//DTD HT ...
- git-flow-avh的使用过程
安装: 在mac上 brew install git-flow-avh 使用: 在仓库中 git flow init 一路回车就行,这个命令相当于写入一些默认命令流程到.git中, 此命令执行之后会增 ...
- <!--[if IE]><style></style><![endif]-->
CSS hack就是为了让你的CSS代码兼容不同的浏览器,其中最难对付的就是IE浏览器的兼容性,因为它的版本很多,不过还好,微软发表声明已经不对IE8以下的版本进行维护了.但是我们也不能就认为不用学I ...
- c++对c的拓展_常量引用
常量引用:不能通过引用去修改引用所指向的内容 const int &ref =val; // const int *const ref =&val; 注意:可引用常量 (普通引用无法 ...
- 网络协议之:socket协议详解之Unix domain Socket
目录 简介 什么是Unix domain Socket 使用socat来创建Unix Domain Sockets 使用ss命令来查看Unix domain Socket 使用nc连接到Unix do ...
- Mybatis结果集映射问题
之前的数据库图简单都是纯小写格式,这一次做项目为了显得正规一些,模拟实际的情况,采用了驼峰命名的规则,这时候就遇到了结果匹配的问题. 之前只要 <select id="select&q ...
- 新手入门C语言第十章:C作用域规则
C 作用域规则任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问.C 语言中有三个地方可以声明变量: 在函数或块内部的局部变量 在所有函数外部的全局变量 在形式参数的函数 ...
- vue3 数据可视化项目
可视化面板介绍 应对现在数据可视化的趋势,越来越多企业需要在很多场景(营销数据,生产数据,用户数据)下使用,可视化图表来展示体现数据,让数据更加直观,数据特点更加突出. 01-使用技术 完成该项目 ...