• This repository has been archived on 14/Sep/2023
  • Stars
    star
    503
  • Rank 87,079 (Top 2 %)
  • Language
    Python
  • License
    Apache License 2.0
  • Created over 6 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

🐍 A hyper-fast Python module for reading/writing JSON data using Rust's serde-json.

hyperjson

Build Status

A hyper-fast, safe Python module to read and write JSON data. Works as a drop-in replacement for Python's built-in json module. This is alpha software and there will be bugs, so maybe don't deploy to production just yet. πŸ˜‰

⚠️ NOTE

This project is not actively maintained. orjson is likely the better alternative.

Installation

pip install hyperjson

Usage

hyperjson is meant as a drop-in replacement for Python's json module:

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

Motivation

Parsing JSON is a solved problem; so, no need to reinvent the wheel, right?
Well, unless you care about performance and safety.

Turns out, parsing JSON correctly is a hard problem. Thanks to Rust however, we can minimize the risk of running into stack overflows or segmentation faults however.

hyperjson is a thin wrapper around Rust's serde-json and pyo3. It is compatible with Python 3 (and 2 on a best-effort basis).

For a more in-depth discussion, watch the talk about this project recorded at the Rust Cologne Meetup in August 2018.

Goals

  • Compatibility: Support the full feature-set of Python's json module.
  • Safety: No segfaults, panics, or overflows.
  • Performance: Significantly faster than json and as fast as ujson (both written in C).

Non-goals

  • Support ujson and simplejson extensions:
    Custom extensions like encode(), __json__(), or toDict() are not supported. The reason is, that they go against PEP8 (e.g. dunder methods are restricted to the standard library, camelCase is not Pythonic) and are not available in Python's json module.
  • Whitespace preservation: Whitespace in JSON strings is not preserved. Mainly because JSON is a whitespace-agnostic format and serde-json strips them out by default. In practice this should not be a problem, since your application must not depend on whitespace padding, but it's something to be aware of.

Benchmark

We are not fast yet. That said, we haven't done any big optimizations. In the long-term we might explore features of newer CPUs like multi-core and SIMD. That's one area other (C-based) JSON extensions haven't touched yet, because it might make code harder to debug and prone to race-conditions. In Rust, this is feasible due to crates like faster or rayon.

So there's a chance that the following measurements might improve soon.
If you want to help, check the instructions in the Development Environment section below.

Test machine:
MacBook Pro 15 inch, Mid 2015 (2,2 GHz Intel Core i7, 16 GB RAM) Darwin 17.6.18

Serialization benchmarks Deserialization benchmarks

Contributions welcome!

If you would like to hack on hyperjson, here's what needs to be done:

Just pick one of the open tickets. We can provide mentorship if you like. πŸ˜ƒ

Developer guide

This project uses poetry for managing the development environment. If you don't have it installed, run

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
export PATH="$HOME/.poetry/bin:$PATH"

The project requires the nightly version of Rust.

Install it via rustup:

rustup install nightly

If you have already installed the nightly version, make sure it is up-to-date:

rustup update nightly

After that, you can compile the current version of hyperjson and execute all tests and benchmarks with the following commands:

make install
make test
make bench

🀫 Pssst!... run make help to learn more.

Drawing pretty diagrams

In order to recreate the benchmark histograms, you first need a few additional prerequisites:

On macOS, please also add the following to your ~/.matplotlib/matplotlibrc (reference):

backend: TkAgg

After that, run the following:

make plot

License

hyperjson is licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in hyperjson by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

More Repositories

1

idiomatic-rust

πŸ¦€ A peer-reviewed collection of articles/talks/repos which teach concise, idiomatic Rust.
4,626
star
2

the-coding-interview

Programming exercises, code katas and puzzles for your job interview training - or just for fun.
Python
1,697
star
3

cargo-inspect

Pssst!... see what Rust is doing behind the curtains πŸ•΅πŸ€«
Rust
384
star
4

fcat

A 3x faster implementation of cat, using splice
Rust
249
star
5

vscode-snippet

🐀 A Visual Studio Code extension for cheat.sh. Quickly and easily find code snippets for any language right inside your IDE.
TypeScript
236
star
6

kafka-influxdb

High performance Kafka consumer for InfluxDB. Supports collectd message formats.
Python
215
star
7

timelapse

🎬 Native macOS app for recording timelapse videos of your desktop.
Python
214
star
8

prettyprint

Beautifully formatted output for your terminal 🌈
Rust
203
star
9

zerocal

πŸš«πŸ“† Serverless calendar built with shuttle.rs
Rust
164
star
10

futures-batch

An adapter for futures, which chunks up elements and flushes them after a timeout β€” or when the buffer is full. (Formerly known as tokio-batch.)
Rust
67
star
11

envy

πŸ’« Manage environment variables without cluttering your .zshrc.
Rust
64
star
12

PHPench

Realtime benchmarks for PHP code
PHP
53
star
13

teams-call

Shell script to detect when you're in a Microsoft Teams Call. Supports Linux and macOS.
Python
51
star
14

mos6502

MOS 6502 emulator written in Rust
Rust
42
star
15

Creamy

A simple CMS in the style of Perch.
PHP
32
star
16

endler.dev

HTML
26
star
17

rust-for-x

Rust for {Ruby, Haskell, C, ...} programmers
24
star
18

rustly

A toy Rustlang URL shortener using Rocket
Rust
21
star
19

pandoc-memoir

Convert Markdown to beautiful PDF using pandoc, LaTeX, and chocolate donuts.
TeX
16
star
20

riffraff

A commandline interface for Jenkins (like `fly` for Concourse).
Go
15
star
21

slack

A simple, idiomatic, fully documented Rust library for the Slack Web API
Rust
11
star
22

rate-limits

Parse HTTP Rate-Limit headers of different vendors
Rust
10
star
23

svg-metadata

Read metadata information of an SVG file (e.g. viewBox size)
Rust
9
star
24

beacon

A dedicated endpoint for real user monitoring. Works with boomerang, statsc and others.
JavaScript
9
star
25

karban

Jekyll for invoices. A static invoice compiler that generates PDFs and HTML from Markdown files.
PHP
9
star
26

spaceglenda

Vectorized, colorized version of Space Glenda, the Plan 9 mascot.
8
star
27

dotvim

My VIM configuration.
Vim Script
8
star
28

pygments-rs

Rust bindings for pygments, a powerful syntax highlighter
Rust
7
star
29

cargo-deliver

πŸ“¦ Run goreleaser with cargo to publish pre-built Rust binaries on Github/Dockerhub/Artifactory
Rust
7
star
30

dropix

A self-updating, caching Dropbox gallery for your website. Customizable, too!
PHP
7
star
31

menudon

πŸ˜πŸ’¬ Mastodon client for your macOS menubar
JavaScript
6
star
32

gh-stats

Async command-line tool for retrieving the stars of all your Github projects. 🌟
Rust
6
star
33

money

Sample code for my talk Idiomatic Rust, which I gave at FOSDEM 2018.
Rust
6
star
34

docker-php-phan

A Docker image for etsy's phan, the static analyzer for PHP
Shell
6
star
35

mre.github.io.v1

Version 1 of my blog, built with Jekyll
HTML
5
star
36

teapot

πŸ«– A super simple dummy server for testing HTTP clients. No dependencies. The little brother of https://github.com/mufeedvh/binserve.
Rust
5
star
37

cargo-inspect-vscode

A Visual Studio Code extension for cargo-inspect
TypeScript
5
star
38

tracker

Realtime hand gesture recognition to control your window manager
Python
5
star
39

awesome-static-analysis-ci

Continuous integration for the awesome static analysis project
Rust
5
star
40

PHP-Crawler

Web Crawler - with email/link scraping and proxy support
PHP
5
star
41

mre.github.io.v2

Version 2 of my blog, built with Cobalt (Rust). Good times
Liquid
5
star
42

jquery.ratingbar

Create graphical ratings (stars, bars) from text: 4/5 => β˜…β˜…β˜…β˜…β˜†
JavaScript
4
star
43

lqip

A boring commandline tool for generating lqip image thumbnails
Rust
4
star
44

rust-cli-workshop

Learn Rust by writing CLI tools!
PHP
4
star
45

engldict

Dabblings into language learning
Python
4
star
46

edgecast

A golang client for the Edgecast API
Go
3
star
47

mos6532

MOS 6532 Emulator
Rust
3
star
48

cudampi

Large hybrid CPU/GPU sorting network using CUDA and MPI
C++
3
star
49

kafka-benchmark

A simple kafka script for benchmarking kafka message throughput
Python
3
star
50

freq

πŸ—Ό A CLI term frequency analyzer. Counts the number of occurrences of each word in an input and creates formatted output or a histogram.
Rust
3
star
51

Process

A lightweight PHP wrapper for interactive subprocesses
PHP
3
star
52

rust-language-bindings

A list of available language bindings for Rust
2
star
53

mre

This is m(r)e
2
star
54

past

Rust
2
star
55

async-talk

Slides and additional material for my talk about asynchronous programming
HTML
2
star
56

swarm-demo

Demonstrates the networking and load-balancing power of Docker Swarm
Go
2
star
57

jbmc

Java Bounded Model Checker
Java
2
star
58

envsync

Keeps `.env` files in sync with `env.sample`.
Rust
2
star
59

jQuery.anchorfy

Create a linked list of all headers inside a container. Supports animations and is easy to adjust.
HTML
2
star
60

bromance

A friendly commandline tool for bro and tldr
Python
1
star
61

maxminddb-rust-bench

Rust
1
star
62

mre.github.io.v3

Version 3 of my blog, built with Zola (Rust). It was a great time.
HTML
1
star
63

stream-processors

Just a list of stream-processors
1
star
64

GnuPlot

A thin wrapper around GnuPlot
PHP
1
star
65

npm-quickCal

an easy to use booking appointment calendar
JavaScript
1
star
66

DrawRoom

Distraction free drawing
Python
1
star
67

peek

Experiments with an alternative remote desktop implementation
Python
1
star
68

voctokey

Control voctomix remotely via keyboard shortcuts
Python
1
star
69

accs

Parse menu of the ACCS cantine DΓΌsseldorf.
Python
1
star
70

llama

A silly game written in Python using cocos2d
Python
1
star
71

toypc

A shitty Rust implementation of http://adventofcode.com/day/23
Rust
1
star
72

ideas

Pretty please make them real.
1
star
73

sheldon

A wonderful directory of useful shell-scripts
Shell
1
star
74

collectd

A docker image for collectd compiled from source
1
star
75

Talks

...mostly Computer Science related.
JavaScript
1
star
76

live

Live programming / workshop material
HTML
1
star