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第三方库的知识。


目录
相关文章
|
24天前
|
XML JSON 数据库
Python的标准库
Python的标准库
162 77
|
25天前
|
XML JSON 数据库
Python的标准库
Python的标准库
47 11
|
2月前
|
人工智能 API 开发工具
aisuite:吴恩达发布开源Python库,一个接口调用多个大模型
吴恩达发布的开源Python库aisuite,提供了一个统一的接口来调用多个大型语言模型(LLM)服务。支持包括OpenAI、Anthropic、Azure等在内的11个模型平台,简化了多模型管理和测试的工作,促进了人工智能技术的应用和发展。
133 1
aisuite:吴恩达发布开源Python库,一个接口调用多个大模型
|
25天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
64 8
|
1月前
|
安全 API 文件存储
Yagmail邮件发送库:如何用Python实现自动化邮件营销?
本文详细介绍了如何使用Yagmail库实现自动化邮件营销。Yagmail是一个简洁强大的Python库,能简化邮件发送流程,支持文本、HTML邮件及附件发送,适用于数字营销场景。文章涵盖了Yagmail的基本使用、高级功能、案例分析及最佳实践,帮助读者轻松上手。
35 4
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
30天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
18天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
102 80
|
2月前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
152 59
|
7天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
29 14