Python3,听说这个第三方库竟碾压python自带JSON库。

简介: Python3,听说这个第三方库竟碾压python自带JSON库。

1、引言

小屌丝:鱼哥,学习python,必须要掌握哪些库?

小鱼:这要看你从事哪方面的开发了。

小屌丝:这还有关系呢?

小鱼:那肯定的啊,

  • 如果你学习AI,就需要掌握Scikit-learn库、Pytorch、Tensorflow等,
  • 如果你学习数据分析,那需要掌握Pandas、Numpy 等
  • 如果学习爬虫开发,那就需要掌握request、BeautifulSoup、lxml、re等

小屌丝:鱼哥,那你说,我把json库玩的特别溜,我能不能从事python后端开发??

小鱼:嗯?? 你确定你json库玩的特别溜吗?

小屌丝:那还有假,倒背如流。

小鱼:那正好,有个粉丝提问,json库存储能力差,如何能解决这个问题呢?

小屌丝:额…

小鱼:“略带微笑”… 想一想,该如何回答?

小屌丝:…这个问题,正好是我也想问你的。

小鱼:…好吧。

关于粉丝提问的如何解决json库性能差,功能少等问题,

我们可以换一个思路来理解,

是否有一个第三方josn库,可以解决这些问题呢?

答案是,肯定的。


例如:ujson库、rapidjson、simplejson、orjson等等。


但是在这些json第三方库中,又有一个,性能是碾压其他库的,

小屌丝:难道是 orjson库?

小鱼:嗯,你可算是说对一次了。

接下来,我们就来介绍orjson库。

2、示例实战

因为orjson支持 python版本:3.7 ~ 3.10的所有64的版本。

2.1 安装

凡是涉及第三方库,必须需要安装

老规矩,pip 安装:

pip install orjson

其它安装方式,直接看这两篇:

2.2 序列化

  • orjson 序列化结果是 bytes型
  • json 序列化结果 是 str型

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2022-07-03
# @Author : carl_DJ
import json
import orjson
import  random
import time
''' 
序列化
orjson 序列化结果是 bytes型
json 序列化结果 是 str型
'''
# 序列化100W个典元素的列表进行序列化
demo_json = [
    {
    'id' : 99999,
    'value': random.uniform(0,1000)
    }
    for i in range(1000000)
]

运行结果

我们可以看到,json运行结果1.73s

orjson运行结果191ms

结果跟我们的预期一样,奈斯。

2.3 反序列化

将JSON数据转换为Python对象的过程我们称之为反序列化,使用orjson.loads()进行操作,可接受bytes、str型等常见类型,

我们依然使用上面的代码示例。

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2022-07-03
# @Author : carl_DJ
import json
import orjson
import  random
import time
''' 
反序列化
'''
# 序列化100W个典元素的列表进行序列化
demo_json = [
    {
    'id' : 99999,
    'value': random.uniform(0,1000)
    }
    for i in range(1000000)
]

运行结果

2.4 OPTION选项

2.4.1 OPT_INDENT_2

orjson的序列化操作中,可以通过参数option来配置诸多额外功能,

例如:

配置option=orjson.OPT_INDENT_2,

可以为序列化后的JSON结果添加2个空格的缩进美化效果,从而弥补其没有参数indent的不足,

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2022-07-03
# @Author : carl_DJ
import json
import orjson
demo_json = {"星星点灯":{"王心凌组":"张天爱、阿娇、阿Sa、吴谨言"},"玉":{"谭维维组":"薛凯琪、郭采洁、毛俊杰、齐溪"},"无名的人":{"郑秀妍组":["朱洁静","张俪","王紫璇","张歆艺"]}}
#默认输出结果
print(f'未配置option时,输出结果:{orjson.dumps(demo_json).decode()}')
#设置OPT_INDENT_2
print(f'已配置option后,输出结果:{orjson.dumps(demo_json,option=orjson.OPT_INDENT_2).decode()}')

运行结果

2.4.2 OPTION组合

当序列化操作需要涉及多种option功能时,则可以使用|运算符来组合多个option参数即可:

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2022-07-03
# @Author : carl_DJ
import  numpy as np
import json
import orjson
'''
组合多种option
'''
demo_json = {
    'zz':np.random.randint(1,10,(2,3)),
    'xx':np.random.randint(1,10,(2,3)),
    'aa':np.random.randint(1,10,(2,3))
    }
print(orjson.dumps(demo_json,option=orjson.OPT_SERIALIZE_NUMPY | orjson.OPT_SORT_KEYS))

运行结果

2.4.3 OPT_SERIALIZE_NUMPY

orjson的一大重要特性是其可以将包含numpy中数据结构对象的复杂对象,兼容性地转换为JSON中的数组,配合option=orjson.OPT_SERIALIZE_NUMPY即可:

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2022-07-03
# @Author : carl_DJ
import  numpy as np
import json
import orjson
'''
OPT_SERIALIZE_NUMPY
'''
demo_json = {
    'np':np.random.randint(1,10,(5,10))
}
demo_json
orjson.dumps(demo_json,option=orjson.OPT_SERIALIZE_NUMPY)

运行结果

2.4.4 OPT_SERIALIZE_UUID

除了可以自动序列化numpy对象外,orjson还支持对UUID对象进行转换,在orjson 3.0之前的版本中,需要配合option=orjson.OPT_SERIALIZE_UUID,

但是小鱼用的是3.9的版本,所以不需要额外配置参数。

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2022-07-03
# @Author : carl_DJ
import  numpy as np
import uuid
import json
import orjson
'''
OPT_SERIALIZE_UUID
'''
demo_json = {
    'uuid':uuid.uuid4()
}
demo_json
orjson.dumps(demo_json)

运行结果

2.4.5 OPT_SORT_KEYS

通过配合参数option=orjson.OPT_SORT_KEYS,可以对序列化后的结果自动按照键进行排序。

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2022-07-03
# @Author : carl_DJ
import json
import orjson
'''
OPT_SORT_KEYS
'''
#未设置排序
orjson.dumps({"c":1,"b":11,"a":6})
#设置排序
orjson.dumps({"c":1,"b":11,"a":6},option=orjson.OPT_SORT_KEYS)

2.5 自定义处理策略

2.5.1 对数据进行脱敏

如果需要序列化的对象中涉及到dataclass自定义数据结构时,

可以使用orjson.OPT_PASSTHROUGH_DATACLASS,

再通过对default参数传入自定义处理函数,来实现更为自由的数据转换逻辑。

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2022-07-03
# @Author : carl_DJ
from dataclasses import dataclass
import uuid
import orjson
@dataclass
class User:
    id:str
    tel_numb:int
def default(obj):
    if isinstance(obj,User):
        tel_numb_st = str(obj.tel_numb)
        return {
            'id':obj.id,
            'tel_numb':f'{tel_numb_st[:3]}xxxx{tel_numb_st[-4:]}'
        }
    raise  TypeError
demo_json = {
    'user':User(id=str(uuid.uuid4()),tel_numb=13666667777)
}
orjson.dumps(demo_json,
             option=orjson.OPT_PASSTHROUGH_DATACLASS,
             default=default)

运行结果

2.5.2 日期自定义转换

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2022-07-03
# @Author : carl_DJ
import orjson
from datetime import datetime
def default(obj):
    if isinstance(obj,datetime):
        return obj.strftime('%Y年%m月%d日')
    raise TypeError
demo_json = {
    'now':datetime.now()
}
orjson.dumps(demo_json,
             option=orjson.OPT_PASSTHROUGH_DATETIME,
             default=default).decode()

运行结果

3、总结

看到这里,今天的分享差不多就要结束了。

关于orjson库的知识,也讲的差不多了。

如果orjson能解决的问题,还是建议使用orjson这个第三方库。

因为不管是从性能、自由组合配置等都是吊打json库的,

但是,

对数据的处理没有那么高的要求,就是小数据量的处理,那就保持原样即可。

不管怎样,能在工作中解决掉问题,即可。


最后,再唠叨一句:

关注小鱼博客,带你学习更多关于python第三方库的知识。


目录
相关文章
|
19天前
|
调度 开发者 Python
Python中的异步编程:理解asyncio库
在Python的世界里,异步编程是一种高效处理I/O密集型任务的方法。本文将深入探讨Python的asyncio库,它是实现异步编程的核心。我们将从asyncio的基本概念出发,逐步解析事件循环、协程、任务和期货的概念,并通过实例展示如何使用asyncio来编写异步代码。不同于传统的同步编程,异步编程能够让程序在等待I/O操作完成时释放资源去处理其他任务,从而提高程序的整体效率和响应速度。
|
9天前
|
XML 存储 数据库
Python中的xmltodict库
xmltodict是Python中用于处理XML数据的强大库,可将XML数据与Python字典相互转换,适用于Web服务、配置文件读取及数据转换等场景。通过`parse`和`unparse`函数,轻松实现XML与字典间的转换,支持复杂结构和属性处理,并能有效管理错误。此外,还提供了实战案例,展示如何从XML配置文件中读取数据库连接信息并使用。
Python中的xmltodict库
|
16天前
|
数据库 Python
异步编程不再难!Python asyncio库实战,让你的代码流畅如丝!
在编程中,随着应用复杂度的提升,对并发和异步处理的需求日益增长。Python的asyncio库通过async和await关键字,简化了异步编程,使其变得流畅高效。本文将通过实战示例,介绍异步编程的基本概念、如何使用asyncio编写异步代码以及处理多个异步任务的方法,帮助你掌握异步编程技巧,提高代码性能。
51 4
|
16天前
|
API 数据处理 Python
探秘Python并发新世界:asyncio库,让你的代码并发更优雅!
在Python编程中,随着网络应用和数据处理需求的增长,并发编程变得愈发重要。asyncio库作为Python 3.4及以上版本的标准库,以其简洁的API和强大的异步编程能力,成为提升性能和优化资源利用的关键工具。本文介绍了asyncio的基本概念、异步函数的定义与使用、并发控制和资源管理等核心功能,通过具体示例展示了如何高效地编写并发代码。
25 2
|
17天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
15天前
|
数据采集 数据可视化 数据挖掘
利用Python进行数据分析:Pandas库实战指南
利用Python进行数据分析:Pandas库实战指南
|
5天前
|
存储 数据挖掘 开发者
Python编程入门:从零到英雄
在这篇文章中,我们将一起踏上Python编程的奇幻之旅。无论你是编程新手,还是希望拓展技能的开发者,本教程都将为你提供一条清晰的道路,引导你从基础语法走向实际应用。通过精心设计的代码示例和练习,你将学会如何用Python解决实际问题,并准备好迎接更复杂的编程挑战。让我们一起探索这个强大的语言,开启你的编程生涯吧!
|
11天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
11天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
11天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
下一篇
无影云桌面