Я использую модуль json
в Python 2.6 для загрузки и декодирования файлов JSON. Однако в настоящее время я становлюсь медленнее, чем ожидалось. Я использую тестовый файл размером 6 МБ, а json.loads()
занимает 20 секунд.
Я думал, что для модуля json
был встроенный код для ускорения декодирования?
Как проверить, используется ли это?
В качестве сравнения я загрузил и установил модуль python-cjson
, а cjson.decode()
занимает 1 секунду для того же теста.
Я предпочел бы использовать модуль JSON, поставляемый с Python 2.6, чтобы пользователям моего кода не требовалось устанавливать дополнительные модули.
(Я разрабатываю Mac OS X, но получаю аналогичный результат в Windows XP.)
Ответ 1
Он может варьироваться в зависимости от платформы, но встроенный модуль json основан на simplejson, не включая ускорения C. Я нашел simplejson таким же быстрым, как python-cjson, поэтому я предпочитаю его, так как он, очевидно, имеет тот же интерфейс, что и встроенный.
try:
import simplejson as json
except ImportError:
import json
Мне кажется, что лучшая идиома на какое-то время, давая производительность, когда она доступна, будучи совместимой с первыми.
Ответ 2
Новая Yajl - еще одна библиотека JSON очень быстро.
yajl serialize: 0.180 deserialize: 0.182 total: 0.362
simplejson serialize: 0.840 deserialize: 0.490 total: 1.331
stdlib json serialize: 2.812 deserialize: 8.725 total: 11.537
Вы можете сравнить сами библиотеки.
Обновление: UltraJSON еще быстрее.
Ответ 3
Я разбирал тот же файл 10x. Размер файла: 1 856 944 байт.
Python 2.6:
yajl serialize: 0.294 deserialize: 0.334 total: 0.627
cjson serialize: 0.494 deserialize: 0.276 total: 0.769
simplejson serialize: 0.554 deserialize: 0.268 total: 0.823
stdlib json serialize: 3.917 deserialize: 17.508 total: 21.425
Python 2.7:
yajl serialize: 0.289 deserialize: 0.312 total: 0.601
cjson serialize: 0.232 deserialize: 0.254 total: 0.486
simplejson serialize: 0.288 deserialize: 0.253 total: 0.540
stdlib json serialize: 0.273 deserialize: 0.256 total: 0.528
Не знаете, почему цифры непропорциональны вашим результатам. Я думаю, новые библиотеки?
Ответ 4
посмотрите UltraJSON https://github.com/esnme/ultrajson
здесь мой тест (код от: https://gist.github.com/lightcatcher/1136415)
платформа: OS X 10.8.3 MBP 2.2 ГГц Intel Core i7
JSON:
simplejson == 3.1.0
Python-cjson == 1.0.5
jsonlib == 1.6.1
ujson == 1,30
yajl == 0.3.5
JSON Benchmark
2.7.2 (default, Oct 11 2012, 20:14:37)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)]
-----------------------------
ENCODING
simplejson: 0.293394s
cjson: 0.461517s
ujson: 0.222278s
jsonlib: 0.428641s
json: 0.759091s
yajl: 0.388836s
DECODING
simplejson: 0.556367s
cjson: 0.42649s
ujson: 0.212396s
jsonlib: 0.265861s
json: 0.365553s
yajl: 0.361718s
Ответ 5
В моей установке Python 2.6.1 на windows пакет json
загружает модуль _json
, который встроен во время выполнения. C
источник для модуля json speedups
здесь.
>>> import _json
>>> _json
<module '_json' (built-in)>
>>> print _json.__doc__
json speedups
>>> dir(_json)
['__doc__', '__name__', '__package__', 'encode_basestring_ascii', 'scanstring']
>>>
Ответ 6
Даже если _json
доступен, я заметил, что json-декодирование очень медленное на CPython 2.6.6. Я не сравнился с другими реализациями, но я переключился на строковые манипуляции, когда внутри критических критических циклов.
Ответ 7
Для тех, кто выполняет синтаксический анализ вывода из запроса с использованием пакета запросов, например:
res = requests.request(...)
text = json.loads(res.text)
Это может быть очень медленно для большего содержимого ответа, скажем, ~ 45 секунд для 6 МБ на моем MacBook в 2017 году. Это не вызвано медленным парсером json, но вместо этого путем определения медленного набора символов вызовом res.text.
Вы можете решить эту проблему, установив набор символов перед вызовом res.text и используя cchardet (см. также здесь):
if res.encoding is None:
res.encoding = cchardet.detect(res.content)['encoding']
Это делает текст ответа json почти мгновенным!