문제

나는 많은 프로젝트를 사용하는 것을 보았다 simplejson 대신 모듈 json 표준 라이브러리의 모듈. 또한 여러 가지가 있습니다 simplejson 모듈. 표준 라이브러리의 대신이 대안을 사용하는 이유는 무엇입니까?

도움이 되었습니까?

해결책

json ~이다 simplejson, stdlib에 추가되었습니다. 하지만 그때부터 json 2.6에 추가되었습니다. simplejson 더 많은 파이썬 버전 (2.4+)에서 작업 할 수 있다는 이점이 있습니다.

simplejson 또한 파이썬보다 더 자주 업데이트되므로 최신 버전이 필요하거나 원한다면 사용하는 것이 가장 좋습니다. simplejson 가능하다면 그 자체.

내 생각에, 좋은 관행은 하나 또는 다른 하나를 폴백으로 사용하는 것입니다.

try:
    import simplejson as json
except ImportError:
    import json

다른 팁

나는 다른 답변에 동의하지 않아야한다 : 내장 된 json 라이브러리 (Python 2.7) simplejson. 또한 가지고 있지 않습니다 이 성가신 유니 코드 버그.

간단한 벤치 마크는 다음과 같습니다.

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은 1.56666707993 초를 덤프합니다
SimpleJson은 2.25638604164 초를 덤프합니다
JSON은 2.71256899834 초를로드합니다
SimpleJSON은 1.29233884811 초를로드합니다

간단한 데이터 :
JSON은 0.370109081268 초를 덤프합니다
SimpleJson은 0.574181079865 초를 덤프합니다
JSON은 0.422876119614 초를로드합니다
SimpleJSON은 0.270955085754 초를로드합니다

덤핑을 위해 json 보다 빠릅니다 simplejson. 로딩을 위해 simplejson 보다 빠르다.

현재 웹 서비스를 구축하고 있기 때문에 dumps() 더 중요합니다. 표준 라이브러리를 사용하는 것이 항상 선호됩니다.

또한, cjson 지난 4 년 동안 업데이트되지 않았으므로 만지지 않을 것입니다.

이 모든 답변은 모두 도움이되지 않습니다. 시간에 민감합니다.

내 자신의 연구를 한 후 simplejson 실제로 내장보다 빠릅니다. 만약에 최신 버전으로 업데이트하십시오.

pip/easy_install Ubuntu 12.04에 2.3.2를 설치하고 싶었지만 최신 정보를 찾은 후 simplejson 버전은 실제로 3.3.0이므로 업데이트하고 시간 테스트를 다시 시작했습니다.

  • simplejson 내장보다 약 3 배 빠릅니다 json 하중에서
  • simplejson 내장보다 약 30% 빠릅니다 json 덤프에서

부인 성명:

위의 진술은 Python-2.7.3 및 Simplejson 3.3.0 (C 속도를 갖춘)에 있으며 내 대답도 시간에 민감하지 않은지 확인하려면 나만의 테스트를 실행하십시오 버전마다 너무 다르기 때문에 확인합니다. 시간 민감하지 않은 쉬운 대답은 없습니다.

SimpleJson에서 C 속도가 활성화되어 있는지 확인하는 방법 :

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

업데이트: 나는 최근에라는 도서관을 발견했다 UJSON 그것은 ~ 3 배 더 빠르게 수행됩니다 simplejson 몇 가지 기본 테스트로.

JSON, SimpleJSON 및 CJSON을 벤치마킹했습니다.

  • CJSON은 가장 빠릅니다
  • SimpleJson은 거의 CJSON과 동등합니다
  • JSON은 SimpleJson보다 약 10 배 느립니다

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]'

Python 2.7 vs SimpleJson 3.3.1에서 찾은 API 비 호환성은 출력이 STR 또는 유니 코드 객체를 생성하는지 여부에 있습니다. 예를 들어

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

vs

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

선호도가 SimpleJson을 사용하는 경우 : 인수 문자열을 유니 코드로 강요하여 다음과 같이 해결할 수 있습니다.

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

강압은 원래 숯을 알아야합니다.

>>> 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 라이브러리의 (현재 구식) 비교는 다음과 같습니다.

Python의 JSON 모듈 비교 (아카이브 링크)

이 비교 결과에 관계없이 Python 2.6에있는 경우 표준 라이브러리 JSON을 사용해야합니다. 그리고 .. 그렇지 않으면 SimpleJson을 사용할 수도 있습니다.

SimpleJSON 모듈은 JSON보다 단순히 1,5 배 빠릅니다 (내 컴퓨터에서 SimpleJson 2.1.1 및 Python 2.7 x86).

원한다면 벤치 마크를 시도 할 수 있습니다. http://abral.altervista.org/jsonpickle-bench.zip내 PC에서 Simplejson은 CPickle보다 빠릅니다. 당신의 벤치 마크도 알고 싶습니다!

아마도 Coady와 같이 SimpleJSON과 JSON의 차이점은 SimpleJSON에 _speedups.c를 포함한다는 것입니다. 그렇다면 Python 개발자가 SimpleJSON을 사용하지 않는 이유는 무엇입니까?

python3에서, 당신이 문자열이라면 b'bytes', 와 함께 json 당신은해야합니다 .decode() 로드하기 전에 내용. simplejson 당신이 그냥 할 수 있도록 이것을 처리합니다 simplejson.loads(byte_string).

Python 2.6 용 SimpleJson을 설치하려고했을 때이 질문을 발견했습니다. JSON 파일을 OrderedDict로로드하려면 JSON.LOAD ()의 'Object_Pairs_Hook'을 사용해야했습니다. 최신 버전의 Python에 익숙해지면 Python 2.6 용 JSON 모듈에는 'object_pairs_hook'가 포함되어 있지 않으므로이 목적을 위해 SimpleJSON을 설치해야했습니다. 개인적인 경험에서 이것은 표준 JSON 모듈과 달리 SimpleJSON을 사용하는 이유입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top