Производительность декодирования Python 2.6 JSON - PullRequest
45 голосов
/ 01 апреля 2009

Я использую модуль json в Python 2.6 для загрузки и декодирования файлов JSON. Однако в настоящее время я получаю медленнее, чем ожидалось, производительность. Я использую тестовый пример размером 6 МБ, а json.loads() занимает 20 секунд.

Я думал, что модуль json имеет некоторый собственный код для ускорения декодирования?

Как проверить, используется ли это?

Для сравнения, я скачал и установил модуль python-cjson, и cjson.decode() занимает 1 секунду для того же теста.

Я бы лучше использовал модуль JSON, поставляемый с Python 2.6, чтобы пользователям моего кода не требовалось устанавливать дополнительные модули.

(Я работаю на Mac OS X, но получаю аналогичный результат на Windows XP.)

Ответы [ 7 ]

30 голосов
/ 28 апреля 2011

Новый 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 еще быстрее.

23 голосов
/ 01 апреля 2009

Может варьироваться в зависимости от платформы, но встроенный модуль json основан на simplejson , не включая ускорения C. Я обнаружил, что simplejson так же быстр, как python-cjson, поэтому я предпочитаю его, поскольку он, очевидно, имеет тот же интерфейс, что и встроенный.

try:
    import simplejson as json
except ImportError:
    import json

Мне кажется, это лучшая идиома на некоторое время, обеспечивающая производительность, когда она доступна, и совместимость с форвардами.

17 голосов
/ 25 января 2013

Я анализировал один и тот же файл 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

Не уверен, почему цифры несоразмерны с вашими результатами. Я полагаю, более новые библиотеки?

13 голосов
/ 15 марта 2013

посмотрите UltraJSON https://github.com/esnme/ultrajson

вот мой тест (код от: https://gist.github.com/lightcatcher/1136415)

платформа: OS X 10,8,3 МБ / с 2,2 ГГц Intel Core i7

JSON:

simplejson == 3.1.0

питон-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
3 голосов
/ 08 октября 2017

Для тех, кто анализирует выходные данные из запроса, используя пакет запросов, например ::10000

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 практически мгновенным!

2 голосов
/ 01 апреля 2009

Глядя на мою установку 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']
>>> 
1 голос
/ 04 апреля 2011

Несмотря на то, что _json доступно, я заметил, что декодирование json очень медленно в CPython 2.6.6. Я не сравнивал с другими реализациями, но я переключился на манипуляции со строками в циклах, критичных к производительности.

...