文章目录UltraJSON用 C 语言编写的 Python JSON 解析器UltraJSON用 C 语言编写的 Python JSON 解析器UltraJSON 是一个用纯 C 编写的 Python JSON 编码和解码库拥有 4,488 颗 Star它的设计目标是替代 Python 标准库中的 json 模块在保持接口兼容的前提下提供更快的序列化和反序列化速度。UltraJSON 的安装方式很直接通过 pip 即可python-mpipinstallujson导入后可以直接替换标准库的 json 模块使用importujson ujson.dumps([{key:value},81,True])ujson.loads([{key: value}, 81, true])UltraJSON 提供了几个编码选项用于控制输出行为。encode_html_chars用于将不安全的 HTML 字符编码为更安全的 Unicode 序列默认关闭。ensure_ascii控制是否将输出限制在 ASCII 范围内并对扩展字符进行转义默认开启如果终端支持 UTF8关闭该选项可以节省空间。escape_forward_slashes控制是否转义正斜杠默认开启。indent用于控制是否生成带缩进的格式化 JSON默认值为 0 即关闭。这个库没有全局状态在多线程环境中使用是安全的不需要额外加锁。不过需要注意不要在序列化对象的同时从另一个线程修改该对象否则结果不可预期。基准测试数据展示了 UltraJSON 与标准库 json、simplejson 以及 orjson 的性能对比。测试环境为 Linux 5.15 上的 CPython 3.11.3ujson 版本为 5.7.1。以包含 256 个双精度浮点数的数组为例UltraJSON 编码速度达到每秒 18,282 次调用标准库 json 为 5,935 次simplejson 为 5,681 次orjson 则达到 79,569 次。解码速度为每秒 28,765 次json 为 13,367 次simplejson 为 13,844 次orjson 为 93,283 次。在包含 256 个字符串的数组编码测试中UltraJSON 达到每秒 44,769 次json 为 23,565 次orjson 为 125,920 次。解码速度为每秒 28,518 次json 为 42,221 次simplejson 为 41,496 次orjson 为 75,043 次。对于包含 256 个 True 值的数组UltraJSON 编码速度高达每秒 110,444 次json 为 84,347 次orjson 为 425,919 次。解码速度为每秒 203,430 次json 为 156,249 次simplejson 为 146,867 次orjson 为 318,193 次。在中等复杂度对象的测试中UltraJSON 编码速度为每秒 11,672 次json 为 5,729 次simplejson 为 3,913 次orjson 为 47,659 次。解码速度为每秒 12,522 次json 为 9,720 次simplejson 为 8,007 次orjson 为 23,599 次。从整体来看UltraJSON 在多数场景下优于标准库 json 和 simplejson但 orjson 在各个测试项中都保持明显领先。对于有特殊构建需求的用户UltraJSON 提供了几个环境变量选项。UJSON_BUILD_NO_STRIP用于在 Linux 平台上保留调试符号。UJSON_BUILD_DC_INCLUDES和UJSON_BUILD_DC_LIBS用于链接系统提供的 double conversion 库而不是使用捆绑的版本。选择外部库时需要注意 ABI 兼容性问题升级系统库或将编译好的 wheel 文件复制到其他机器时可能产生问题。不过UltraJSON 的维护团队已将项目置于仅维护模式。新的 Python 版本支持会继续添加关键 bug 和安全问题也会修复但其他变更将被拒绝。团队在公告中解释UltraJSON 的架构在修改时容易引入安全漏洞因此做出了这个决定。他们建议用户迁移到 orjson后者速度更快且缓冲区溢出风险更低。对于仍在使用 UltraJSON 的项目可以继续依赖它获取安全修复和版本兼容更新。在新项目中如果 JSON 处理性能是关键考量orjson 会是更合适的选择。新项目中如果 JSON 处理性能是关键考量orjson 会是更合适的选择。
UltraJSON:用 C 语言编写的 Python JSON 解析器
文章目录UltraJSON用 C 语言编写的 Python JSON 解析器UltraJSON用 C 语言编写的 Python JSON 解析器UltraJSON 是一个用纯 C 编写的 Python JSON 编码和解码库拥有 4,488 颗 Star它的设计目标是替代 Python 标准库中的 json 模块在保持接口兼容的前提下提供更快的序列化和反序列化速度。UltraJSON 的安装方式很直接通过 pip 即可python-mpipinstallujson导入后可以直接替换标准库的 json 模块使用importujson ujson.dumps([{key:value},81,True])ujson.loads([{key: value}, 81, true])UltraJSON 提供了几个编码选项用于控制输出行为。encode_html_chars用于将不安全的 HTML 字符编码为更安全的 Unicode 序列默认关闭。ensure_ascii控制是否将输出限制在 ASCII 范围内并对扩展字符进行转义默认开启如果终端支持 UTF8关闭该选项可以节省空间。escape_forward_slashes控制是否转义正斜杠默认开启。indent用于控制是否生成带缩进的格式化 JSON默认值为 0 即关闭。这个库没有全局状态在多线程环境中使用是安全的不需要额外加锁。不过需要注意不要在序列化对象的同时从另一个线程修改该对象否则结果不可预期。基准测试数据展示了 UltraJSON 与标准库 json、simplejson 以及 orjson 的性能对比。测试环境为 Linux 5.15 上的 CPython 3.11.3ujson 版本为 5.7.1。以包含 256 个双精度浮点数的数组为例UltraJSON 编码速度达到每秒 18,282 次调用标准库 json 为 5,935 次simplejson 为 5,681 次orjson 则达到 79,569 次。解码速度为每秒 28,765 次json 为 13,367 次simplejson 为 13,844 次orjson 为 93,283 次。在包含 256 个字符串的数组编码测试中UltraJSON 达到每秒 44,769 次json 为 23,565 次orjson 为 125,920 次。解码速度为每秒 28,518 次json 为 42,221 次simplejson 为 41,496 次orjson 为 75,043 次。对于包含 256 个 True 值的数组UltraJSON 编码速度高达每秒 110,444 次json 为 84,347 次orjson 为 425,919 次。解码速度为每秒 203,430 次json 为 156,249 次simplejson 为 146,867 次orjson 为 318,193 次。在中等复杂度对象的测试中UltraJSON 编码速度为每秒 11,672 次json 为 5,729 次simplejson 为 3,913 次orjson 为 47,659 次。解码速度为每秒 12,522 次json 为 9,720 次simplejson 为 8,007 次orjson 为 23,599 次。从整体来看UltraJSON 在多数场景下优于标准库 json 和 simplejson但 orjson 在各个测试项中都保持明显领先。对于有特殊构建需求的用户UltraJSON 提供了几个环境变量选项。UJSON_BUILD_NO_STRIP用于在 Linux 平台上保留调试符号。UJSON_BUILD_DC_INCLUDES和UJSON_BUILD_DC_LIBS用于链接系统提供的 double conversion 库而不是使用捆绑的版本。选择外部库时需要注意 ABI 兼容性问题升级系统库或将编译好的 wheel 文件复制到其他机器时可能产生问题。不过UltraJSON 的维护团队已将项目置于仅维护模式。新的 Python 版本支持会继续添加关键 bug 和安全问题也会修复但其他变更将被拒绝。团队在公告中解释UltraJSON 的架构在修改时容易引入安全漏洞因此做出了这个决定。他们建议用户迁移到 orjson后者速度更快且缓冲区溢出风险更低。对于仍在使用 UltraJSON 的项目可以继续依赖它获取安全修复和版本兼容更新。在新项目中如果 JSON 处理性能是关键考量orjson 会是更合适的选择。新项目中如果 JSON 处理性能是关键考量orjson 会是更合适的选择。