Ускоряем сериализацию 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))
Подводные камни
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 это закрывает большинство случаев.