本文示例程式碼及檔案已上傳至我的
Github
倉庫https://github.com/CNFeffery/DataScienceStudyNotes
1 簡介
大家好我是費老師,我們在日常使用Python
的過程中,經常會使用json
格式儲存一些資料,尤其是在web
開發中。而Python
原生的json
庫效能差、功能少,只能堪堪應對簡單輕量的json
資料儲存轉換需求。
而本文我要給大家介紹的第三方json
庫orjson
,在公開的各項基準效能測試中,以數倍至數十倍的效能優勢碾壓json
、ujson
、rapidjson
、simplejson
等其他Python
庫,且具有諸多額外功能,下面我們就來領略其常用方法吧~
2 orjson常用方法
orjson
支援3.7
到3.10
所有版本64位的Python
,本文演示對應的orjson
的版本為3.7.0
,直接使用pip install -U orjson
即可完成安裝。下面我們來對orjson
中的常用方法進行演示:
2.1 序列化
與原生json
庫類似,我們可以使用orjson.dumps()
將Python
物件序列化為JSON
資料,注意,略有不同的是,orjson
序列化的結果並不是str
型而是bytes
型,在下面的例子中,我們對包含一千萬個簡單字典元素的列表進行序列化,orjson
與json
庫的耗時比較如下:
2.2 反序列化
將JSON
資料轉換為Python
物件的過程我們稱之為反序列化,使用orjson.loads()
進行操作,可接受bytes
、str
型等常見型別,在前面例子的基礎上我們新增反序列化的例子:
2.3 豐富的option選項
在orjson
的序列化操作中,可以通過引數option
來配置諸多額外功能,常用的有:
- OPT_INDENT_2
通過配置option=orjson.OPT_INDENT_2
,我們可以為序列化後的JSON
結果新增2個空格的縮排美化效果,從而彌補其沒有引數indent
的不足:
- OPT_OMIT_MICROSECONDS
orjson.dumps()
可以直接將Python
中datetime
、time
等標準庫中的日期時間物件轉換成相應的字串,這是原生json
庫做不到的,而通過配置option=orjson.OPT_OMIT_MICROSECONDS
,可以將轉換結果字尾的毫秒部分省略掉:
- OPT_NON_STR_KEYS
當需要序列化的物件存在非數值型鍵時,orjson
預設會丟擲TypeError
錯誤,這時需要配置option=orjson.OPT_NON_STR_KEYS
來強制將這些鍵轉換為字元型:
- OPT_SERIALIZE_NUMPY
orjson
的一大重要特性是其可以將包含numpy
中資料結構物件的複雜物件,相容性地轉換為JSON
中的陣列,配合option=orjson.OPT_SERIALIZE_NUMPY
即可:
- OPT_SERIALIZE_UUID
除了可以自動序列化numpy
物件外,orjson
還支援對UUID
物件進行轉換,在orjson 3.0
之前的版本中,需要配合option=orjson.OPT_SERIALIZE_UUID
,而本文演示的3.X
版本則無需額外配置引數:
- OPT_SORT_KEYS
通過配合引數option=orjson.OPT_SORT_KEYS
,可以對序列化後的結果自動按照鍵進行排序:
- 組合多種option
當你的序列化操作需要涉及多種option
功能時,則可以使用|
運算子來組合多個option
引數即可:
2.4 針對dataclass、datetime新增自定義處理策略
當你需要序列化的物件中涉及到dataclass
自定義資料結構時,可以配合orjson.OPT_PASSTHROUGH_DATACLASS
,再通過對default
引數傳入自定義處理函式,來實現更為自由的資料轉換邏輯,譬如下面簡單的例子中,我們可以利用此特性進行原始資料的脫敏操作:
類似的,針對datetime
型別資料,我們同樣可以配合OPT_PASSTHROUGH_DATETIME
和自定義default
函式實現日期自定義格式化轉換:
orjson
更多特性可前往官方倉庫https://github.com/ijl/orjson
瞭解更多~
以上就是本文的全部內容,歡迎在評論區與我進行討論~