Cysimdjson:地球上最快的 JSON 解析器
处理简单的少量数据,对速度是无感的,但如果要处理大量数据,哪怕每次几十毫秒的差异,最终也会差异巨大。
比如,你要为客户清洗一遍企业系统数据中,一堆之前留下的庞大的 JSON 文件。如果你打算用 Python 自带的 JSON 模块,那就调整好心态,备足咖啡,享受煎熬吧。
但如果有人告诉你,有比 Python 自带 JSON 模块快 7 倍的工具,你会心动吗?反正我会迫不及待。
这个工具就是 cysimdjson —— 一个号称地球上最快的 JSON 解析器。
Cysimdjson 的魅力
cysimdjson 是一个为 Python 量身打造的 JSON 解析库。
在数据处理领域,它就像一颗冉冉升起的新星,带来了前所未有的速度体验。
与 Python 标准库的 json 或者其他类似的 ujson 等 JSON 解析库相比较,cysimdjson 在处理大型文件时,展现出惊人的速度优势 —— 有着 7 到 12 倍的速度提升。
口说无凭,看看对比效果:
----------------------------------------------------------------
# 'jsonexamples/gsoc-2018.json' 3327831 bytes
----------------------------------------------------------------
* cysimdjson parse 775.61 EPS ( 1.00) 2581.09 MB/s
* pysimdjson parse 743.67 EPS ( 1.04) 2474.81 MB/s
* libpy_simdjson loads 654.15 EPS ( 1.19) 2176.88 MB/s
* orjson loads 166.67 EPS ( 4.65) 554.66 MB/s
* python json loads 113.72 EPS ( 6.82) 378.43 MB/s
----------------------------------------------------------------
SIMDJSON: 703.59 EPS, 2232.92 MB/s
这个测试数据展示了几种不同的 JSON 解析库在处理大小为 3327831 字节(约为3.17MB)的 JSON 文件时的性能。
具体来说,cysimdjson 的解析速度是 Python JSON 库 的约 6.82 倍!
而这一切,都要归功于其背后的黑科技 —— 使用 SIMD(单指令多数据)指令集的 C++ 库 simdjson,称作地球上最快的 JSON 解析器也不为过。
项目地址:https://github.com/TeskaLabs/cysimdjson
安装 cysimdjson
虽然 cysimdjson 并非 Python 标准库的一部分,但安装它并不复杂。
只需打开你的命令行工具,输入如下命令,轻轻松松就能完成安装:
pip3 install cysimdjson
安装前,确保你的 Python 版本在 3.6 或更高,以获得最佳的兼容性和性能。
基本功能
cysimdjson 的基本用法相当简单直观。
以下是几个示范场景,帮你快速掌握它的强大之处。
JSON 解析
import cysimdjson
json_bytes = b'''
{
"array": [1, 2, 3],
"boolean": true,
"color": "gold",
"null": null,
"number": 123,
"object": {"a": "b", "c": "d"},
"string": "Hello World"
}
'''
parser = cysimdjson.JSONParser()
json_element = parser.parse(json_bytes)
print(json_element.at_pointer("/array/1")) # 输出: 2
在这里,我们创建了一个 cysimdjson.JSONParser 对象来解析字节字符串。
通过指向对应数据的 JSON Pointer[1],我们可以轻松地访问嵌套的数据。
Pythonic API 使用
json_parsed = parser.loads(json_bytes)
print(json_parsed['object']['a']) # 输出: 'b'
如你所见,json_parsed 对象提供了类似字典的访问方式,这使得 cysimdjson 的使用体验与 Python 自带的 JSON 模块非常接近。
高级用法
cysimdjson 还有一些进阶功能,比如,可以使用 parse_in_place 方法来加速解析,不过这需要有 SIMDJSON 预期的填充 (padding)。
更快的解析
# 使用 parse_in_place 进行快速解析
parsed_fast = parser.parse_in_place(json_bytes)
请记住,为了达成这速度,cysimdjson 做了一些取舍。比如,解析器输出的对象是只读的,且并非真正的 Python 字典,而是惰性求值的字典类对象。
实践
要真正体验 cysimdjson 的速度,试着用它来解析一些大型的 JSON 文件。
为了最大化性能,尝试重用 JSONParser 对象。
如果你熟悉命令行操作,还可以写一个小脚本来比较 cysimdjson 与 Python 标准库 JSON 模块在解析同一个大文件时的速度差异。
总结
在大多数情况下,Python 标准库提供的工具已经足够好用。
但当你遇到运算瓶颈时,就需要特殊的工具来突破限制。
cysimdjson 正是在处理大型 JSON 数据时的利器,它让解析工作变得如此迅速,以至于其他库相比让人感觉就像是在骑自行车赛跑车。