跳转到主要内容

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

项目描述

hyperjson

Build Status

一个用于读取和写入JSON数据的超快、安全的Python模块。可以作为Python内置的json模块的替代品。这是一个alpha软件,可能会存在bug,所以可能还不适合在生产环境中使用 用于测试。 :wink

安装

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模块快得多,与C语言编写的ujson一样快。

非目标

  • 支持ujson和simplejson扩展:
    自定义扩展,如encode()__json__()toDict(),不受支持。原因是,它们违反了PEP8规范(例如,双下划线方法仅限于标准库,驼峰命名法不是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,以下是需要完成的工作

只需选择一个未解决的票据。如果你愿意,我们可以提供指导。:smiley

开发者指南

本项目使用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的任何有意贡献,都将双许可如上所述,不附加任何额外条款或条件。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分发

此版本没有提供源代码分发文件。请参阅生成分发存档的教程

构建分发

hyperjson-0.2.4-cp38-none-win_amd64.whl (164.2 kB 查看散列值)

上传时间 CPython 3.8 Windows x86-64

hyperjson-0.2.4-cp38-cp38-manylinux1_x86_64.whl (191.1 kB 查看散列值)

上传时间 CPython 3.8

hyperjson-0.2.4-cp38-cp38-macosx_10_7_x86_64.whl (167.6 kB 查看散列值)

上传时间 CPython 3.8 macOS 10.7+ x86-64

hyperjson-0.2.4-cp37-none-win_amd64.whl (164.2 kB 查看散列值)

上传时间 CPython 3.7 Windows x86-64

hyperjson-0.2.4-cp37-cp37m-manylinux1_x86_64.whl (191.1 kB 查看散列值)

上传时间 CPython 3.7m

hyperjson-0.2.4-cp37-cp37m-macosx_10_7_x86_64.whl (167.6 kB 查看散列值)

上传时间 CPython 3.7m macOS 10.7+ x86-64

hyperjson-0.2.4-cp36-none-win_amd64.whl (164.4 kB 查看散列值)

上传时间 CPython 3.6 Windows x86-64

hyperjson-0.2.4-cp36-cp36m-manylinux1_x86_64.whl (191.2 kB 查看散列值)

上传时间 CPython 3.6m

hyperjson-0.2.4-cp36-cp36m-macosx_10_7_x86_64.whl (167.8 kB 查看散列值)

上传于 CPython 3.6m macOS 10.7+ x86-64

hyperjson-0.2.4-cp35-none-win_amd64.whl (164.4 kB 查看哈希值)

上传于 CPython 3.5 Windows x86-64

hyperjson-0.2.4-cp35-cp35m-manylinux1_x86_64.whl (191.2 kB 查看哈希值)

上传于 CPython 3.5m

hyperjson-0.2.4-cp35-cp35m-macosx_10_7_x86_64.whl (167.8 kB 查看哈希值)

上传于 CPython 3.5m macOS 10.7+ x86-64

由以下支持