5個常用的dict屬性化訪問擴展庫
- 嵌套結構
- 高級功能
- 性能
- 綜合建議
在前面我們詳細講解了 Box和 Munch這兩個dict屬性化訪問的擴展庫,總體而言它們主要用于提升配置文件數據、JSON對象數據的可讀性,減少了代碼中雙引號。在這一領域中還有dotmap、addict 和 easydict等,本節我們就來對比一下這五個dict屬性化訪問擴展庫。
鑒于 box、munch、dotmap、addict 和 easydict在基本使用上都比較接近,在此不再贅述,本節主要考察它們在嵌套結構、高級功能和性能上的差異,以幫助我們在實際使用中做出合適的選擇。
嵌套結構
功能 | addict | munch | box | dotmap | easydict |
---|---|---|---|---|---|
自動解析嵌套 | ? | ? | ? | ? | ? |
自動創建嵌套 | ? d.user.name = “Alice” | ? d[‘user’] = Munch(); d.user.name = “Alice” | ? Box(default_box=True) | ? d.user.name = “Alice” | ? 需手動設置子項為 EasyDict |
淺拷貝 | ? | ? | ? | ? | ? |
深拷貝 | ? | ? | ? merge_update | ? | ? |
高級功能
功能 | addict | munch | box | dotmap | easydict |
---|---|---|---|---|---|
默認值(auto create) | ? | ? | ? default_box | ? | ? |
深度合并 | ? | ?? 有限支持 | ? merge_update | ? | ? |
屬性與鍵沖突保護 | ? | ? | ? | ? | ? |
JSON / YAML 友好 | ? | ? | ? | ? | ? |
凍結/只讀模式 | ? | ? | ?(可配置) | ? | ? |
性能
使用 timeit 進行 .user.name 和[‘user’][‘name’] 的性能測試(百萬次訪問)(單位:秒)
庫 | 原生 dict | addict | munch | box | dotmap | easydict |
---|---|---|---|---|---|---|
訪問時間 | 0.07s | ~0.40s | ~0.30s | ~0.60s | ~0.35s | ~0.25s |
賦值時間 | 0.08s | ~0.45s | ~0.35s | ~0.65s | ~0.38s | ~0.28s |
嵌套創建 | ? | ? 快 | ? | ? 中 | ? 中 | ? |
綜合建議
在進行本次對比時,以上五個擴展庫在pypi上的最后release時間分別為:
- box 2025
- easydict 2024
- munch 2023
- dotmap 2022
- addict 2020
考慮到用新不用舊的原則以及上述綜合因素,建議一般情況下可以使用box
,對性能有一定要求時,可以選用easydict
。