Но у стандартной библиотеки json есть проблема - она относительно медленная.
Если ваше веб приложение должно тянуть держать нагрузку, то такие популярные операции как сериализация и десериализация JSON хорошо бы максимально оптимизировать. Каждый запрос это преобразование JSON-строки в объект, обработка запроса, и обратное кодирование объекта в JSON-строку. Буквально - каждый!
Исходные данные для теста:
file = 'data.json' # 156kb
with open(file, 'r') as f:
file_data = f.read()
data = json.loads(file_data)
count = 50000
Сделаем эталонный замер стандартной библиотеки
start = time.perf_counter()
for i in range(count):
json.loads(file_data)
end = time.perf_counter()
json_time_decode = end - start
start = time.perf_counter()
for i in range(count):
json.dumps(data)
end = time.perf_counter()
json_time_encode = end - start
print(f'Json time: {round(json_time_decode, 2)}s/{round(json_time_encode)}s')
# Json time: 50.04s/40s
Итак, какие есть альтернативы?
Сравнивать будем с библиотеками orjson и ujson.
Код находится на github, а здесь приведу только результаты.
Json time: 50.04s/40s
Orjson time: 20.27s [2.47x speed] / 5.46s [7.35x speed]
Ujson time: 47.29s [1.06x speed] / 35.04s [1.15x speed]
Неплохой прирост с orjson я считаю! А вот ujson не особо опередил.
Тест проводился на Windows 10. Интересно, что на Linux ujson даже медленней чем стандартный. Но, думаю, это у меня какие-то проблемки.
В тесты я не добавил simplejson. Он не сильно быстрей стандартного модуля.
Если вы пишете приложения на FastAPI, то в 3 строки можете ускорить обработку JSON-ответа! Есть встроенный класс для этого.
1. Установка
poetry add orjson
# or
pip install orjson
2. Имопрт
from fastapi.responses import ORJSONResponse
# Там же лежит и UJSONResponse
3. Подключение
app = FastAPI(
...
default_response_class=ORJSONResponse
)
Для Django тоже есть решение: drf-orjson-renderer
#libs