Каковы различия между модулями Python JSON и SimpleJson?

StackOverflow https://stackoverflow.com/questions/712791

  •  23-08-2019
  •  | 
  •  

Вопрос

Я видел много проектов, использующих simplejson модуль вместо json модуль из стандартной библиотеки. Кроме того, есть много разных simplejson модули. Зачем использовать эти альтернативы, а не та, что в стандартной библиотеке?

Это было полезно?

Решение

json является simplejson, добавлено в stdlib. Но с тех пор json был добавлен в 2,6, simplejson имеет преимущество работы над большим количеством версий Python (2.4+).

simplejson также обновляется чаще, чем Python, поэтому, если вам нужна (или хотите) последняя версия, лучше всего использовать simplejson сам, если возможно.

На мой взгляд, хорошая практика - использовать один или другой в качестве запасного.

try:
    import simplejson as json
except ImportError:
    import json

Другие советы

Я должен не согласиться с другими ответами: встроенный json Библиотека (в Python 2.7) не обязательно медленнее, чем simplejson. Анкет У него также нет Эта раздражающая ошибка Unicode.

Вот простой тест:

import json
import simplejson
from timeit import repeat

NUMBER = 100000
REPEAT = 10

def compare_json_and_simplejson(data):
    """Compare json and simplejson - dumps and loads"""
    compare_json_and_simplejson.data = data
    compare_json_and_simplejson.dump = json.dumps(data)
    assert json.dumps(data) == simplejson.dumps(data)
    result = min(repeat("json.dumps(compare_json_and_simplejson.data)", "from __main__ import json, compare_json_and_simplejson", 
                 repeat = REPEAT, number = NUMBER))
    print "      json dumps {} seconds".format(result)
    result = min(repeat("simplejson.dumps(compare_json_and_simplejson.data)", "from __main__ import simplejson, compare_json_and_simplejson", 
                 repeat = REPEAT, number = NUMBER))
    print "simplejson dumps {} seconds".format(result)
    assert json.loads(compare_json_and_simplejson.dump) == data
    result = min(repeat("json.loads(compare_json_and_simplejson.dump)", "from __main__ import json, compare_json_and_simplejson", 
                 repeat = REPEAT, number = NUMBER))
    print "      json loads {} seconds".format(result)
    result = min(repeat("simplejson.loads(compare_json_and_simplejson.dump)", "from __main__ import simplejson, compare_json_and_simplejson", 
                 repeat = REPEAT, number = NUMBER))
    print "simplejson loads {} seconds".format(result)


print "Complex real world data:" 
COMPLEX_DATA = {'status': 1, 'timestamp': 1362323499.23, 'site_code': 'testing123', 'remote_address': '212.179.220.18', 'input_text': u'ny monday for less than \u20aa123', 'locale_value': 'UK', 'eva_version': 'v1.0.3286', 'message': 'Successful Parse', 'muuid1': '11e2-8414-a5e9e0fd-95a6-12313913cc26', 'api_reply': {"api_reply": {"Money": {"Currency": "ILS", "Amount": "123", "Restriction": "Less"}, "ProcessedText": "ny monday for less than \\u20aa123", "Locations": [{"Index": 0, "Derived From": "Default", "Home": "Default", "Departure": {"Date": "2013-03-04"}, "Next": 10}, {"Arrival": {"Date": "2013-03-04", "Calculated": True}, "Index": 10, "All Airports Code": "NYC", "Airports": "EWR,JFK,LGA,PHL", "Name": "New York City, New York, United States (GID=5128581)", "Latitude": 40.71427, "Country": "US", "Type": "City", "Geoid": 5128581, "Longitude": -74.00597}]}}}
compare_json_and_simplejson(COMPLEX_DATA)
print "\nSimple data:"
SIMPLE_DATA = [1, 2, 3, "asasd", {'a':'b'}]
compare_json_and_simplejson(SIMPLE_DATA)

И результаты моей системы (Python 2.7.4, Linux 64-бит):

Сложные данные реального мира:
JSON Dumps 1,56666707993 секунды
SimpleJson Damps 2,25638604164 секунд
JSON загружает 2,71256899834 секунды
SimpleJson загрузки 1.29233884811 секунд

Простые данные:
JSON Draps 0,370109081268 секунд
SimpleJson сбрасывает 0,574181079865 секунд
JSON загружает 0,422876119614 секунд
SimpleJson загружает 0,270955085754 секунды

За сброс, json быстрее, чем simplejsonАнкет Для загрузки, simplejson быстрее.

С тех пор, как я сейчас строю веб -сервис, dumps() более важно - и использование стандартной библиотеки всегда предпочтительнее.

Также, cjson Не был обновлен за последние 4 года, поэтому я не буду прикоснуться к нему.

Все эти ответы не очень полезны, потому что они чувствительное время.

После некоторых собственных исследований я обнаружил, что simplejson действительно быстрее, чем встроенный, если Вы держите его в курсе последней версии.

pip/easy_install Хотел установить 2.3.2 на Ubuntu 12.04, но после того, как вы узнали о последних simplejson Версия на самом деле 3.3.0, поэтому я обновил ее и повторно проерал.

  • simplejson примерно в 3 раза быстрее, чем встроенный json При нагрузках
  • simplejson примерно на 30% быстрее, чем встроенный json на свалках

Отказ от ответственности:

Приведенные выше утверждения находятся в Python-2.7.3 и Simplejson 3.3.0 (с ускорением C), и чтобы мой ответ также не чувствителен к времени, вы должны Запустите свои собственные тесты проверить, так как это сильно меняется между версиями; Нет простого ответа, который не чувствителен к времени.

Как определить, включены ли ускорения C в SimpleJson:

import simplejson
# If this is True, then c speedups are enabled.
print bool(getattr(simplejson, '_speedups', False))

ОБНОВИТЬ: Я недавно наткнулся на библиотеку под названием Уджсон это работает ~ 3 раза быстрее, чем simplejson с некоторыми основными тестами.

Я подвергал сравнению JSON, SimpleJson и CJSON.

  • CJSON самый быстрый
  • SimpleJson почти наравне с CJSON
  • JSON примерно в 10 раз медленнее, чем SimpleJson

http://pastie.org/1507411:

$ python test_serialization_speed.py 
--------------------
   Encoding Tests
--------------------
Encoding: 100000 x {'m': 'asdsasdqwqw', 't': 3}
[      json] 1.12385 seconds for 100000 runs. avg: 0.011239ms
[simplejson] 0.44356 seconds for 100000 runs. avg: 0.004436ms
[     cjson] 0.09593 seconds for 100000 runs. avg: 0.000959ms

Encoding: 10000 x {'m': [['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19]], 't': 3}
[      json] 7.76628 seconds for 10000 runs. avg: 0.776628ms
[simplejson] 0.51179 seconds for 10000 runs. avg: 0.051179ms
[     cjson] 0.44362 seconds for 10000 runs. avg: 0.044362ms

--------------------
   Decoding Tests
--------------------
Decoding: 100000 x {"m": "asdsasdqwqw", "t": 3}
[      json] 3.32861 seconds for 100000 runs. avg: 0.033286ms
[simplejson] 0.37164 seconds for 100000 runs. avg: 0.003716ms
[     cjson] 0.03893 seconds for 100000 runs. avg: 0.000389ms

Decoding: 10000 x {"m": [["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19]], "t": 3}
[      json] 37.26270 seconds for 10000 runs. avg: 3.726270ms
[simplejson] 0.56643 seconds for 10000 runs. avg: 0.056643ms
[     cjson] 0.33007 seconds for 10000 runs. avg: 0.033007ms

Некоторые значения сериализуются по -разному между SimpleJson и JSON.

Примечательно, что случаи collections.namedtuple сериализуются как массивы json Но как объекты simplejson. Анкет Вы можете переопределить это поведение, пройдя namedtuple_as_object=False к simplejson.dump, но по умолчанию поведение не совпадает.

>>> import collections, simplejson, json
>>> TupleClass = collections.namedtuple("TupleClass", ("a", "b"))
>>> value = TupleClass(1, 2)
>>> json.dumps(value)
'[1, 2]'
>>> simplejson.dumps(value)
'{"a": 1, "b": 2}'
>>> simplejson.dumps(value, namedtuple_as_object=False)
'[1, 2]'

Несовместимость API, которую я обнаружил, с Python 2.7 против SimpleJson 3.3.1 заключается в том, производит ли выходные объекты STR или Unicode. например

>>> from json import JSONDecoder
>>> jd = JSONDecoder()
>>> jd.decode("""{ "a":"b" }""")
{u'a': u'b'}

против

>>> from simplejson import JSONDecoder
>>> jd = JSONDecoder()
>>> jd.decode("""{ "a":"b" }""")
{'a': 'b'}

Если предпочтение состоит в том, чтобы использовать SimpleJson, то это можно решить, принуждая строку аргумента к Unicode, как в:

>>> from simplejson import JSONDecoder
>>> jd = JSONDecoder()
>>> jd.decode(unicode("""{ "a":"b" }""", "utf-8"))
{u'a': u'b'}

Принуждение требует знания исходного Charset, например:

>>> jd.decode(unicode("""{ "a": "ξηθννββωφρες" }"""))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 8: ordinal not in range(128)

Это не исправить Выпуск 40

Встроенный json Модуль был включен в Python 2.6. Любые проекты, которые поддерживают версии Python <2,6, должны иметь запасную сторону. Во многих случаях эта запасная сторона simplejson.

Другая причина, по которой проекты используют SimpleJson, заключается в том, что строительный JSON изначально не включал свои ускорения C, поэтому разница в производительности была заметной.

Вот (теперь устаревшее) сравнение библиотек Python JSON:

Сравнение модулей JSON для Python (Архивная ссылка)

Независимо от результатов в этом сравнении, вы должны использовать стандартную библиотеку JSON, если вы находитесь на Python 2.6. И ... может просто использовать SimpleJson в противном случае.

SimpleJson модуль всего в 1,5 раза быстрее, чем JSON (на моем компьютере, с SimpleJson 2.1.1 и Python 2.7 x86).

Если вы хотите, вы можете попробовать тест: http://abral.altervista.org/jsonpickle-bench.zipНа моем ПК SimpleJson быстрее, чем Cpickle. Я хотел бы знать также ваши тесты!

Вероятно, как сказал Коади, разница между SimpleJson и JSON заключается в том, что SimpleJson включает _speedups.c. Итак, почему разработчики Python не используют SimpleJson?

В Python3, если вы b'bytes', с json вы должны .decode() Контент, прежде чем вы сможете загрузить его. simplejson позаботитесь об этом, чтобы вы могли просто сделать simplejson.loads(byte_string).

Я наткнулся на этот вопрос, так как хотел установить SimpleJson для Python 2.6. Мне нужно было использовать 'Object_Pairs_hook' of json.load (), чтобы загрузить файл json в качестве заказывающего дикта. Познаваясь с более поздними версиями Python, я не понимал, что модуль JSON для Python 2.6 не включает в себя 'Object_pairs_hook', поэтому мне пришлось установить SimpleJson для этой цели. Из личного опыта именно поэтому я использую SimpleJson, в отличие от стандартного модуля JSON.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top