blob: 956364970fdc5884880e05d82689fd1b836e41a1 [file] [log] [blame]
Performance
===========
This library is written in Cython for a better performance than a pure-Python implementation could give you.
Decoder Performance
-------------------
The library has about the same speed as the shipped ``json`` module for *pure* JSON data.
* Dataset: https://github.com/zemirco/sf-city-lots-json
* Version: Python 3.9.1+ (default, Feb 5 2021, 13:46:56)
* CPU: AMD Ryzen 7 2700 @ 3.7GHz
* :func:`pyjson5.decode`: **2.08 s** ± 7.49 ms per loop *(lower is better)*
* :func:`json.loads`: **2.71 s** ± 12.1 ms per loop
* The decoder works correcty: ``json.loads(content) == pyjson5.loads(content)``
Encoder Performance
-------------------
The encoder generates pure JSON data if there are no infinite or NaN values in the input, which are invalid in JSON.
The serialized data is XML-safe, i.e. there are no cheverons ``<>``, ampersands ``&``, apostrophes ``'`` or control characters in the output.
The output is always ASCII regardless if you call :func:`pyjson5.encode` or :func:`pyjson5.encode_bytes`.
* Dataset: https://github.com/zemirco/sf-city-lots-json
* Python 3.9.1+ (default, Feb 5 2021, 13:46:56)
* CPU: AMD Ryzen 7 2700 @ 3.7GHz
* :func:`pyjson5.encode`: **1.37** s ± 19.2 per loop *(lower is better)*
* :func:`json.dumps`: **3.66** s ± 72.6 ms per loop
* :func:`json.dumps` + :func:`xml.sax.saxutils.escape`: **4.01** s ± 21.3 ms per loop
* The encoder works correcty: ``obj == json.loads(pyjson5.encode(obj))``
Benchmark
---------
Using `Ultrajson's benchmark <https://github.com/ultrajson/ultrajson/blob/197a7fd4d8bbf0a8355852017c8b25aab26b6777/tests/benchmark.py>`_
you can tell for which kind of data PyJSON5 is fast, and for which data it is slow in comparison *(higher is better)*:
+-----------------------------------------------------------+-------------+------------+------------+------------+
| | json | pyjson5 | ujson | orjson |
+===========================================================+=============+============+============+============+
| **Array with 256 doubles** | | | | |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| encode | 6,425 | 81,202 | 28,966 | 83,836 |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| decode | 16,759 | 34,801 | 34,794 | 80,655 |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| **Array with 256 strings** | | | | |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| encode | 36,969 | 73,165 | 35,574 | 113,082 |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| decode | 42,730 | 38,542 | 38,386 | 60,732 |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| **Array with 256 UTF-8 strings** | | | | |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| encode | 3,458 | 3,134 | 4,024 | 31,677 |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| decode | 2,428 | 2,498 | 2,491 | 1,750 |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| **Array with 256 True values** | | | | |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| encode | 130,441 | 282,703 | 131,279 | 423,371 |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| decode | 220,657 | 262,690 | 264,485 | 262,283 |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| **Array with 256 dict{string, int} pairs** | | | | |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| encode | 11,621 | 10,014 | 18,148 | 73,905 |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| decode | 17,802 | 19,406 | 19,391 | 23,478 |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| **Dict with 256 arrays with 256 dict{string, int} pairs** | | | | |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| encode | 40 | 38 | 68 | 213 |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| decode | 43 | 49 | 48 | 51 |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| **Medium complex object** | | | | |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| encode | 8,704 | 11,922 | 15,319 | 49,677 |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| decode | 12,567 | 14,042 | 13,985 | 19,481 |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| **Complex object** | | | | |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| encode | 672 | 909 | 731 | |
+-----------------------------------------------------------+-------------+------------+------------+------------+
| decode | 462 | 700 | 700 | |
+-----------------------------------------------------------+-------------+------------+------------+------------+
* `ujson <https://github.com/ultrajson/ultrajson>`_ == 4.0.3.dev9
* `orjson <https://github.com/ijl/orjson>`_ == 3.5.1