首页 > 编程语言 >python的orjson

python的orjson

时间:2023-12-18 10:24:27浏览次数:34  
标签:OPT 00 python orjson dumps import 序列化

简介

首先我们先来了解下orjson的优缺点:

  • 可以将datetime、date和time实例序列化为RFC 3339格式,例如:"2022-06-12T00:00:00+00:00"
  • 序列化numpy.ndarray实例的速度比其他库快4-12倍,但使用的内存更少,约为其他库的1/3左右
  • 输出速度是标准库的10到20倍
  • 序列化的结果是bytes类型,而不是str
  • 序列化str时,不会将unicode转义为ASCII
  • 序列化float的速度是其他库的10倍,反序列化的速度是其他库的两倍
  • 可以直接序列化str、int、list和dict的子类
  • 不提供load( )和dump( )方法,在原生JSON库中,load( )方法可以把json格式的文件转换成python对象
  1. 序列化dataclass类型
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)])))
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

输出为:b'{"id":1,"name":"a","members":[{"id":1,"active":true},{"id":2,"active":false}]}'

  1. 序列化 float

orjson序列化和反序列化双精度浮点数,不会损失精度。当序列化NaN,Infinity,-Infinity时,会返回null。

>>> import orjson, ujson, rapidjson, json
>>> orjson.dumps([float("NaN"), float("Infinity"), float("-Infinity")])
b'[null,null,null]'
>>> ujson.dumps([float("NaN"), float("Infinity"), float("-Infinity")])
OverflowError: Invalid Inf value when encoding double
>>> rapidjson.dumps([float("NaN"), float("Infinity"), float("-Infinity")])
'[NaN,Infinity,-Infinity]'
>>> json.dumps([float("NaN"), float("Infinity"), float("-Infinity")])
'[NaN, Infinity, -Infinity]'
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  1. 序列化Int类型

orjson可以对整数进行序列化和反序列化。但web浏览器只支持53-bit的整数,当值超过53-bit时会产生JSONEncodeError。

>>> import orjson
>>> orjson.dumps(9007199254740992)
b'9007199254740992'
>>> orjson.dumps(9007199254740992, option=orjson.OPT_STRICT_INTEGER)
JSONEncodeError: Integer exceeds 53-bit range
>>> orjson.dumps(-9007199254740992, option=orjson.OPT_STRICT_INTEGER)
JSONEncodeError: Integer exceeds 53-bit range
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  1. numpy

序列化numpy数据需要设置option=orjson.OPT_SERIALIZE_NUMPY。

>>> import orjson, numpy
>>> orjson.dumps(
       numpy.array([[1, 2, 3], [4, 5, 6]]),
       option=orjson.OPT_SERIALIZE_NUMPY,
)
b'[[1,2,3],[4,5,6]]'
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  1. str

orjson只处理UTF-8格式的字符串,如果给orjson.dumps()方法传入一个UTF-16的字符串,会产生报错。

>>> import orjson
>>> orjson.dumps('\ud800')
JSONEncodeError: str is not valid UTF-8: surrogates not allowed
  • 1.
  • 2.
  • 3.
  1. uuid

orjson可以把uuid.UUID实例序列化为RFC 4122格式。

>>> import orjson, uuid
>>> orjson.dumps(uuid.UUID('f81d4fae-7dec-11d0-a765-00a0c91e6bf6'))
b'"f81d4fae-7dec-11d0-a765-00a0c91e6bf6"'
>>> orjson.dumps(uuid.uuid5(uuid.NAMESPACE_DNS, "python.org"))
b'"886313e1-3b8a-5372-9b90-0c9aee199e5d"'
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

安装

orjson支持3.7-3.10所有版本64位的Python,注意32位的 Python 无法使用orjson!本文将在3.8.2环境下使用orjson,使用以下命令安装orjson:

pip install --upgrade "pip>=20.3"
pip install --upgrade orjson
  • 1.
  • 2.

使用

  1. 基本使用

我们首先使用orjson序列化一个字典,随后再将结果反序列化:

import orjson, datetime, numpy
data = {
   "type": "job",
   "created_at": datetime.datetime(2022, 6, 12),
   "status": "

标签:OPT,00,python,orjson,dumps,import,序列化
From: https://www.cnblogs.com/xingxia/p/python_orjson.html

相关文章

  • python之DataClass
    Python在版本3.7(PEP557)中引入了dataclass。dataclass允许你用更少的代码和更多的开箱即用功能来定义类。下面定义了一个具有两个实例属性name和age的常规Person类: classPerson:def__init__(self,name,age):self.name=nameself......
  • python迭代器理解
    目录什么是迭代器?为什么要有迭代?迭代器的优缺点什么是可迭代对象?什么是迭代器对象呢?什么是迭代器?在学习for循环的时候,听到了一个词叫可迭代对象。那什么是可迭代对象?了解后又知道了迭代,可迭代,迭代器这些名词,那这些到底是什么意思呢?我们先知道为什么for循环不像whlie循环一样,使......
  • Machine Learning in Python
    MetricFormulaInterpretationAccuracy$\frac{TP+TN}{TP+TN+FP+FN}$OverallperformanceofmodelPrecision$\frac{TP}{TP+FN}$HowaccuratethepositivepredictionsareRecallSensitivity$\frac{TP}{TP+FP}$Coverageofactualpositivesampl......
  • python网站创建011:函数、序列化
    经典函数:JS经典函数定义function函数名(a1,a2){vara3=a1+a2returna3}varres=函数名(11,22)console.log(res) 那如何在浏览器中查看打印结果呢?  匿名函数:没名字的函数,如果只有一个地方用到,则直接使用......
  • 系统聚类思想及其Python实现
    系统聚类是一种将对象或数据按照其相似性进行分组的方法。与传统聚类方法不同,系统聚类通过构建一颗层次树(或称为树状图或谱系图)来展现数据的层次结构。在系统聚类中,数据点最初被视为单独的簇,然后通过逐步合并或分裂,形成一个层次结构的聚类结果。这种层次结构可用于分析数据的不同......
  • Python——作图
    Python——作图百分比堆积柱状图importmatplotlib.pyplotaspltimportnumpyasnp#定义数据categories=['CatA','CatB','CatC']values1=[20,30,15]values2=[10,25,20]values3=[5,10,15]#将数据转化为相对百分比total=np.array(v......
  • Python: Random
     #encoding:utf-8#版权所有2023涂聚文有限公司#许可信息查看:#描述:https://docs.python.org/3/library/string.html#Author:geovindu,GeovinDu涂聚文.#IDE:PyCharm2023.1python3.11#Datetime:2023/12/1718:16#User:geovindu#P......
  • python常用内置模块(持续更新中)
    random模块相关方法需要掌握的,未提及的建议自行了解importrandom大于0且小于1之间的小数(不含1)random.random()#0.38916016381720087指定区间指定start到end(不含end)之间的随机小数random.uniform(0,10)#8.080921224222864指定区间指定start到end(含end)之......
  • Python模块与包
    【一】模块的介绍【1】什么是模块在Python中,一个py文件就是一个模块,文件名为xxx.py模块名则是xxx,导入模块可以引用模块中已经写好的功能。如果把开发程序比喻成制造一台电脑编写模块就像是在制造电脑的零部件准备好零部件后,剩下的工作就是按照逻辑把它们组装到一起。将......
  • Python迭代器和生成器
    【一】迭代器介绍迭代器即用来迭代取值的工具,而迭代是重复反馈过程的活动其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代whileTrue:msg=input(">>:").strip()......