程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python3,聽說這個第三方庫竟碾壓python自帶JSON庫。

編輯:Python

orjson

  • 1、引言
  • 2、示例實戰
    • 2.1 安裝
    • 2.2 序列化
    • 2.3 反序列化
    • 2.4 OPTION選項
      • 2.4.1 OPT_INDENT_2
      • 2.4.2 OPTION組合
      • 2.4.3 OPT_SERIALIZE_NUMPY
      • 2.4.4 OPT_SERIALIZE_UUID
      • 2.4.5 OPT_SORT_KEYS
    • 2.5 自定義處理策略
      • 2.5.1 對數據進行脫敏
      • 2.5.2 日期自定義轉換
  • 3、總結

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

其它安裝方式,直接看這兩篇:

  • Python3,選擇Python自動安裝第三方庫,從此跟pip說拜拜!!
  • Python3:我低調的只用一行代碼,就導入Python所有庫!

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第三方庫的知識。

先自我介紹一下,小編13年上師交大畢業,曾經在小公司待過,去過華為OPPO等大廠,18年進入阿裡,直到現在。深知大多數初中級java工程師,想要升技能,往往是需要自己摸索成長或是報班學習,但對於培訓機構動則近萬元的學費,著實壓力不小。自己不成體系的自學效率很低又漫長,而且容易碰到天花板技術停止不前。因此我收集了一份《java開發全套學習資料》送給大家,初衷也很簡單,就是希望幫助到想自學又不知道該從何學起的朋友,同時減輕大家的負擔。添加下方名片,即可獲取全套學習資料哦


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved