#json #python-module #python #performance

hyperjson

一个用于读取/写入 JSON 数据的 Python 高速模块

4 个版本

0.2.4 2020年1月31日
0.2.3 2020年1月29日
0.2.2 2019年9月21日
0.2.1 2019年9月19日

#26 in #python-module

Apache-2.0

2MB
897 代码行

hyperjson

Build Status

一个超快、安全的 Python 模块,用于读取和写入 JSON 数据。可以作为 Python 内置 json 模块的替代品。这是 alpha 软件,可能会有错误,所以可能不要立即部署到生产环境中。😉

安装

pip install hyperjson

使用方法

hyperjson 旨在作为 Python 的 json 模块 的直接替代品

>>> import hyperjson
>>> hyperjson.dumps([{"key": "value"}, 81, True])
'[{"key":"value"},81,true]'
>>> hyperjson.loads("""[{"key": "value"}, 81, true]""")
[{u'key': u'value'}, 81, True]

动机

解析 JSON 是一个已解决的问题;所以,没有必要重新发明轮子,对吧?
好吧,除非你关心 性能和安全

实际上,正确地解析 JSON 是一个 难题。然而,多亏了 Rust,我们可以最大限度地减少遇到 栈溢出或段错误 的风险。

hyperjson 是 Rust 的 serde-jsonpyo3 的轻量级封装。它与 Python 3(以及在最大努力的基础上支持 Python 2)兼容。

欲了解更多信息,请观看在 2018 年 8 月 Rust Cologne Meetup 上录制的关于此项目的演讲。

目标

  • 兼容性:支持 Python 的 json 模块的全部功能集。
  • 安全:无段错误、恐慌或溢出。
  • 性能:比 json 快得多,与 ujson(两者都是用 C 编写的)一样快。

非目标

  • 不支持 ujson 和 simplejson 扩展:
    不支持自定义扩展,如 encode()__json__()toDict()。原因是,这些与 PEP8 相悖(例如,dunder 方法仅限于标准库,camelCase 不是 Pythonic),并且在 Python 的 json 模块中不可用。
  • 空白保留:JSON 字符串中的空白不保留。主要是因为 JSON 是一个不区分空白格式的格式,而 serde-json 默认会将其删除。在实践中,这应该不会成为问题,因为你的应用程序不能依赖于空白填充,但这是需要注意的一点。

基准测试

我们目前还没有变得很快。话虽如此,我们还没有进行任何大规模优化。从长远来看,我们可能会探索新型CPU(如多核和SIMD)的特性。这是其他(基于C的)JSON扩展尚未触及的领域,因为它可能会使代码更难调试并且容易产生竞态条件。在Rust中,由于有像fasterrayon这样的crate,这是可行的。

因此,以下测量可能会很快得到改善。
如果您想帮忙,请查看下面“开发环境”部分的说明。

测试机器
MacBook Pro 15英寸,2015年中期(2.2 GHz Intel Core i7,16 GB RAM)Darwin 17.6.18

Serialization benchmarks Deserialization benchmarks

欢迎贡献!

如果您想为hyperjson开发,以下是需要完成的工作

  • 实现loads()
  • 实现load()
  • 实现dumps()
  • 实现dump()
  • jsonujson进行基准测试(见#1
  • 添加CI/CD流水线以简化测试(见#2
  • 从它创建一个合适的pip包,以便更容易安装(见#3)。
  • 分析和优化性能(见#16
  • 将剩余的关键字参数添加到方法中

只需选择一个开放的票据。如果您愿意,我们可以提供指导。😃

开发者指南

本项目使用pipenv来管理开发环境。如果您还没有安装,请运行

pip install poetry

本项目需要Rust的nightly版本。

通过rustup安装它

rustup install nightly

如果您已经安装了nightly版本,请确保它是最新的

rustup update nightly

之后,您可以使用以下命令编译当前版本的hyperjson,并执行所有测试和基准测试

make install
make test
make bench

🤫 嘘!...运行make help了解更多信息。

绘制漂亮的图表

为了重新创建基准测试直方图,您首先需要一些额外的先决条件

在macOS上,请将以下内容添加到您的~/.matplotlib/matplotlibrc参考

backend: TkAgg

之后,运行以下命令

make plot

许可证

hyperjson根据您的选择受以下任一许可证的许可

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您提交给hyperjson的任何有意贡献都将按照上述方式双许可,没有任何额外的条款或条件。

依赖关系

~2.8–4MB
~83K SLoC