Cysimdjson:地球上最快的 JSON 解析器

2024-05-08 09:55:33 浏览数 (1)

处理简单的少量数据,对速度是无感的,但如果要处理大量数据,哪怕每次几十毫秒的差异,最终也会差异巨大。 比如,你要为客户清洗一遍企业系统数据中,一堆之前留下的庞大的 JSON 文件。如果你打算用 Python 自带的 JSON 模块,那就调整好心态,备足咖啡,享受煎熬吧。 但如果有人告诉你,有比 Python 自带 JSON 模块快 7 倍的工具,你会心动吗?反正我会迫不及待。 这个工具就是 cysimdjson —— 一个号称地球上最快的 JSON 解析器。

Cysimdjson 的魅力

cysimdjson 是一个为 Python 量身打造的 JSON 解析库。 在数据处理领域,它就像一颗冉冉升起的新星,带来了前所未有的速度体验。 与 Python 标准库的 json 或者其他类似的 ujson 等 JSON 解析库相比较,cysimdjson 在处理大型文件时,展现出惊人的速度优势 —— 有着 7 到 12 倍的速度提升。 口说无凭,看看对比效果:

代码语言:javascript复制
----------------------------------------------------------------
# '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 标准库的一部分,但安装它并不复杂。 只需打开你的命令行工具,输入如下命令,轻轻松松就能完成安装:

代码语言:javascript复制
pip3 install cysimdjson

安装前,确保你的 Python 版本在 3.6 或更高,以获得最佳的兼容性和性能。

基本功能

cysimdjson 的基本用法相当简单直观。 以下是几个示范场景,帮你快速掌握它的强大之处。

JSON 解析
代码语言:javascript复制
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 使用
代码语言:javascript复制
json_parsed = parser.loads(json_bytes)
print(json_parsed['object']['a'])  # 输出: 'b'

如你所见,json_parsed 对象提供了类似字典的访问方式,这使得 cysimdjson 的使用体验与 Python 自带的 JSON 模块非常接近。

高级用法

cysimdjson 还有一些进阶功能,比如,可以使用 parse_in_place 方法来加速解析,不过这需要有 SIMDJSON 预期的填充 (padding)。

更快的解析
代码语言:javascript复制
# 使用  parse_in_place  进行快速解析 
parsed_fast = parser.parse_in_place(json_bytes)

请记住,为了达成这速度,cysimdjson 做了一些取舍。比如,解析器输出的对象是只读的,且并非真正的 Python 字典,而是惰性求值的字典类对象。

实践

要真正体验 cysimdjson 的速度,试着用它来解析一些大型的 JSON 文件。 为了最大化性能,尝试重用 JSONParser 对象。 如果你熟悉命令行操作,还可以写一个小脚本来比较 cysimdjson 与 Python 标准库 JSON 模块在解析同一个大文件时的速度差异。

总结

在大多数情况下,Python 标准库提供的工具已经足够好用。 但当你遇到运算瓶颈时,就需要特殊的工具来突破限制。 cysimdjson 正是在处理大型 JSON 数据时的利器,它让解析工作变得如此迅速,以至于其他库相比让人感觉就像是在骑自行车赛跑车。

0 人点赞