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 `_ 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 `_ == 4.0.3.dev9 * `orjson `_ == 3.5.1