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
2MB
897 代码行
一个超快、安全的 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-json 和 pyo3 的轻量级封装。它与 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中,由于有像faster或rayon这样的crate,这是可行的。
因此,以下测量可能会很快得到改善。
如果您想帮忙,请查看下面“开发环境”部分的说明。
测试机器
MacBook Pro 15英寸,2015年中期(2.2 GHz Intel Core i7,16 GB RAM)Darwin 17.6.18
欢迎贡献!
如果您想为hyperjson开发,以下是需要完成的工作
- 实现
loads()
- 实现
load()
- 实现
dumps()
- 实现
dump()
- 与json和ujson进行基准测试(见#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 License,版本2.0,(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您提交给hyperjson的任何有意贡献都将按照上述方式双许可,没有任何额外的条款或条件。
依赖关系
~2.8–4MB
~83K SLoC