网站首页 > 技术文章 正文
orjson是一个JSON库,可以快速准确地完成Python对象与JSON格式的相互转换。与 Python 原生 JSON 库和其他第三方 JSON 库相比,orjson功能更丰富,效率更高。源代码地址:https ://github.com/ijl/orjson
orjson的优缺点
- Datetime,日期和时间实例可以序列化为 RFC 3339 格式,例如:“2022–09–19T00:00:00+00:00”
- 序列化numpy.ndarray实例比其他库快4-12倍,但使用的内存更少,大约是其他库的1/3
- 输出速度比标准库快10到20倍
- 序列化的结果是bytes,而不是str
- 序列化str时,unicode不转义为ASCII
- 序列化浮点数比其他库快10 倍,反序列化速度是其他库的两倍
- 可以直接序列化str、int、list和dict的子类
- 没有提供 load ()和 dump ()方法。标准库JSON 库中,load ()方法可以将 JSON 格式的文件转换为 python 对象
安装orjson
orjson 只支持64位 Python 3.7以上的所有版本,使用pip安装即可。
pip install orjson
irjson的基本用法
首先用 orjson 序列化一个字典,然后反序列化结果。其中option这个参数代表序列化数据类型,比如时间、numpy。
import orjson, datetime, numpy
data = {
"type": "job",
"created_at": datetime.datetime(2022, 9, 20),
"status": "ok",
"payload": numpy.array([[1, 2], [3, 4]]),
}
serialize = orjson.dumps(data, option=orjson.OPT_NAIVE_UTC | orjson.OPT_SERIALIZE_NUMPY) # 序列化
print(serialize)
deserialize = orjson.loads(serialize) #反序列化
print(deserialize)
运行代码输出如下:
dumps()可以将 Python 对象序列化为 JSON 数据,但与原生 JSON 库不同的是,获取的 JSON 数据orjson.dumps()是 bytes 类型,省略了将 bytes 转换为 str 的操作,因此速度会大大提高加速,loads()可以将 JSON 数据转换为 Python 对象。该方法支持多种数据类型,包括:bytes、bytearray、memoryview、str
性能分析
这里我拿orjson、ujson、simplejson,json来序列化一个包含100000个元素的列表来看看执行耗时。
代码如下:
import orjson, time
import random
start = time.time()
data = [{
'id': 1,
'value': random.uniform(0,2000)
}
for i in range(1000000)]
orjson.dumps(data)
end = time.time()
print("Total time " + str(round(end-start, 2)) + ' s')
以下是每个库执行的耗时表格及截图。
library | Time(s) |
orjson | 0.31 |
json | 0.91 |
ujson | 0.53 |
simplejson | 1.1 |
序列dateclass类型
import dataclasses, orjson, typing
@dataclasses.dataclass
class Member:
id: int
active: bool = dataclasses.field(default=False)
@dataclasses.dataclass
class Object:
id: int
name: str
members: typing.List[Member]
print(orjson.dumps(Object(1, "a", [Member(1, True), Member(2)])))
运行结果:
序列化浮点数类型
orjson序列化和反序列化双精度浮点数而不损失精度。序列化NaN, Infinity, -Infinity时返回 null
import orjson
print(orjson.dumps([float("NaN"), float("Infinity"), float("-Infinity")]))
print(orjson.dumps([float("0.4819"),float("0.11")]))
序列化整数
orjson可以序列化和反序列化整数。但网页浏览器只支持 53 位整数,当值超过53位时,JSONEncodeError 将被引发。
import orjson
print(orjson.dumps(9007199254740992))
print(orjson.dumps(9007199254740992, option=orjson.OPT_STRICT_INTEGER))
序列化numpy
序列化numpy数据需要使用option=orjson.OPT_SERIALIZE_NUMPY
import orjson, numpy
print(orjson.dumps(
numpy.array([[1, 2, 3], [4, 5, 6]]),
option=orjson.OPT_SERIALIZE_NUMPY,
))
序列化字符串
orjson仅处理 UTF-8 格式的字符串。如果将UTF-16字符传递给orjson.dumps(),则会引发错误。
import orjson
print(orjson.dumps('status: ok'))
print(orjson.dumps('\ud800'))
序列化UUID
orjson可以uuid.UUID将实例序列化为 RFC 4122 格式
import uuid,orjson
print(orjson.dumps(uuid.UUID('f81d4fae-7dec-11d0-a765-00a0c91e6bf6')))
print(orjson.dumps(uuid.uuid5(uuid.NAMESPACE_DNS, "python.org")))
- 上一篇: PySide:基于 Qt 框架的 Python 高级 UI 库
- 下一篇: python 基础(四)
猜你喜欢
- 2025-01-11 Python国内第三方镜像下载
- 2025-01-11 Python其实很简单 第十四章 模块
- 2025-01-11 TTS它又来了!OpenVoice一款借鉴于TTS实现的强大AI语音克隆工具
- 2025-01-11 一段获取磁盘空间信息的python脚本
- 2025-01-11 Qt 调用Python引擎混合编程
- 2025-01-11 如何利用Python开发一个Web网站路径扫描工具?
- 2025-01-11 Pydantic:强大的Python 数据验证库
- 2025-01-11 新一代Python包管理工具来了
- 2025-01-11 python 基础(四)
- 2025-01-11 PySide:基于 Qt 框架的 Python 高级 UI 库
- 05-25Python 3.14 t-string 要来了,它与 f-string 有何不同?
- 05-25Python基础元素语法总结
- 05-25Python中的变量是什么东西?
- 05-25新手常见的python报错及解决方案
- 05-2511-Python变量
- 05-2510个每个人都是需要知道Python问题
- 05-25Python编程:轻松掌握函数定义、类型及其参数传递方式
- 05-25Python基础语法
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 90℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 81℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)