производительность· 4 мин

Ускоряем сериализацию JSON с orjson

На одном из горячих эндпоинтов мы отдавали довольно крупные JSON-ответы, и профайлер уверенно показывал, что заметная доля времени уходит на json.dumps. Замена стандартного модуля на orjson сократила время сериализации почти вдвое.

Бенчмарк

Простой замер на словаре с десятью тысячами элементов, 1000 повторов:

import orjson, json, timeit
data = {"items": list(range(10_000))}

print(timeit.timeit(lambda: json.dumps(data), number=1000))
print(timeit.timeit(lambda: orjson.dumps(data), number=1000))
json 1.00× orjson 0.52×
Относительное время сериализации (меньше — лучше). Цифры зависят от данных и железа.

Подводные камни

orjson возвращает bytes, а не str — это нужно учитывать на границах, где ожидается строка. Кроме того, по умолчанию он не умеет сериализовать произвольные объекты: для них передавайте default.

def default(obj):
    if isinstance(obj, Decimal):
        return str(obj)
    raise TypeError

orjson.dumps(payload, default=default)

Зато из коробки поддерживаются datetime, UUID и dataclasses — для веб-API это закрывает большинство случаев.

← ко всем заметкам