Was sind die Unterschiede zwischen JSON- und Simpuljson -Python -Modulen?
-
23-08-2019 - |
Frage
Ich habe viele Projekte verwendet simplejson
Modul statt von json
Modul aus der Standardbibliothek. Außerdem gibt es viele verschiedene simplejson
Module. Warum sollte diese Alternativen statt der in der Standardbibliothek verwendet werden?
Lösung
json
ist simplejson
, hinzugefügt zum STDLIB. Aber seit json
wurde in 2,6 hinzugefügt, simplejson
hat den Vorteil, an mehr Python -Versionen zu arbeiten (2.4+).
simplejson
wird auch häufiger als Python aktualisiert. Wenn Sie also die neueste Version benötigen (oder möchten), ist es am besten zu verwenden simplejson
selbst, wenn möglich.
Meiner Meinung nach ist es eine gute Praxis, das eine oder andere als Fallback zu verwenden.
try:
import simplejson as json
except ImportError:
import json
Andere Tipps
Ich muss mit den anderen Antworten nicht zustimmen: das eingebaute in json
Bibliothek (in Python 2.7) ist nicht unbedingt langsamer als simplejson
. Es hat auch nicht Dieser nervige Unicode -Fehler.
Hier ist ein einfacher Benchmark:
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)
Und die Ergebnisse in meinem System (Python 2.7.4, Linux 64-Bit):
Komplexe Daten der realen Welt:
JSON Dumps 1.56666707993 Sekunden
Simplejson Dumps 2.25638604164 Sekunden
JSON lädt 2.71256899834 Sekunden
Simplejson lädt 1.29233884811 SekundenEinfache Daten:
JSON Dumps 0,370109081268 Sekunden
Simplejson Dumps 0,574181079865 Sekunden
JSON lädt 0,422876119614 Sekunden
Simplejson lädt 0,270955085754 Sekunden
Zum Dumping, json
ist schneller als simplejson
. Zum Laden, simplejson
ist schneller.
Seit ich derzeit einen Webdienst erstelle, dumps()
ist wichtiger - und die Verwendung einer Standardbibliothek wird immer bevorzugt.
Ebenfalls, cjson
Wurde in den letzten 4 Jahren nicht aktualisiert, also würde ich es nicht berühren.
Alle diese Antworten sind nicht sehr hilfreich, weil sie es sind zeitempfindlich.
Nachdem ich selbst einige eigene Recherchen gemacht hatte, fand ich das simplejson
ist in der Tat schneller als der gebaute, wenn Sie halten es auf der neuesten Version auf dem Laufenden.
pip/easy_install
wollte 2.3.2 auf Ubuntu 12.04 installieren, aber nachdem er das Neueste herausgefunden hatte simplejson
Die Version ist eigentlich 3.3.0, also habe ich sie aktualisiert und die Zeittests neu gestaltet.
simplejson
ist ungefähr 3x schneller als der Baujson
Bei Lastensimplejson
ist etwa 30% schneller als der Baujson
bei Müllkopien
Haftungsausschluss:
Die oben genannten Aussagen finden Sie in Python-2.7.3 und Simplejson 3.3.0 (mit C-Geschwindigkeit) und um sicherzustellen, dass meine Antwort auch nicht zeitsensibel ist, sollten Sie es sollten Führen Sie Ihre eigenen Tests durch zu überprüfen, da es zwischen den Versionen so stark variiert; Es gibt keine einfache Antwort, die nicht zeitempfindlich ist.
So erkennen Sie, ob C -Beschleunigungen in simplejson aktiviert sind:
import simplejson
# If this is True, then c speedups are enabled.
print bool(getattr(simplejson, '_speedups', False))
AKTUALISIEREN: Ich bin kürzlich auf eine Bibliothek mit dem Titel gestoßen Ujson das leistet ~ 3x schneller als simplejson
mit einigen grundlegenden Tests.
Ich habe JSON, Simplejson und CJSON benchmarkiert.
- CJSON ist am schnellsten
- Simplejson ist fast auf dem Niveau CJSON
- JSON ist ungefähr 10x langsamer als simplejson
$ 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
Einige Werte werden zwischen Simplejson und JSON unterschiedlich serialisiert.
Insbesondere Fälle von collections.namedtuple
werden als Arrays von serialisiert json
aber als Objekte von simplejson
. Sie können dieses Verhalten überschreiben, indem Sie bestehen namedtuple_as_object=False
zu simplejson.dump
, Aber standardmäßig stimmen die Verhaltensweisen nicht überein.
>>> 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]'
Eine API -Inkompatibilität, die ich gefunden habe, mit Python 2.7 vs SimpleJson 3.3.1 ist, ob die Ausgabe STR- oder Unicode -Objekte erzeugt. z.B
>>> 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'}
Wenn die Präferenz für die Verwendung von SimpleJson ist, kann dies durch Zweiten der Argument -Zeichenfolge zu Unicode angesprochen werden, wie in:
>>> from simplejson import JSONDecoder
>>> jd = JSONDecoder()
>>> jd.decode(unicode("""{ "a":"b" }""", "utf-8"))
{u'a': u'b'}
Der Zwang erfordert beispielsweise das Erkenntnis des ursprünglichen Zeichensets:
>>> 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)
Dies ist das nicht reparieren Ausgabe 40
Das gebaute json
Das Modul wurde in Python 2.6 enthalten. Alle Projekte, die Versionen von Python <2,6 unterstützen, müssen einen Fallback haben. In vielen Fällen ist dieser Fallback simplejson
.
Ein weiterer Grund, warum Projekte SimpleJson verwenden, ist, dass der gebaute JSON ursprünglich seine C -Beschleunigungen nicht umfasste, sodass der Leistungsunterschied spürbar war.
Hier (jetzt veraltet) Vergleich von Python JSON -Bibliotheken:
Vergleich von JSON -Modulen für Python (Archivverbindung)
Unabhängig von den Ergebnissen in diesem Vergleich sollten Sie die Standardbibliothek JSON verwenden, wenn Sie auf Python 2.6 sind. Und .. könnte genauso gut einfach Simplejson verwenden.
Das SimpleJson -Modul ist einfach 1,5 -mal schneller als JSON (auf meinem Computer, mit SimpleJson 2.1.1 und Python 2.7 x86).
Wenn Sie möchten, können Sie den Benchmark ausprobieren: http://abral.altervista.org/jsonpickle-Bench.zipAuf meinem PC ist Simplejson schneller als Cpickle. Ich würde gerne auch Ihre Benchmarks kennen!
Wahrscheinlich besteht der Unterschied zwischen Simplejson und JSON, dass Simplejson _speedups.c enthält. Warum verwenden Python -Entwickler nicht Simplejson?
In Python3, wenn Sie eine Reihe von b'bytes'
, mit json
Sie müssen .decode()
Der Inhalt, bevor Sie ihn laden können. simplejson
Kümmert sich darum, damit Sie es einfach tun können simplejson.loads(byte_string)
.
Ich bin auf diese Frage gestoßen, als ich Simplejson für Python 2.6 installieren wollte. Ich musste das 'object_pairs_hook' von json.load () verwenden, um eine JSON -Datei als ordnungsgemäße Datei zu laden. Da ich mit neueren Versionen von Python vertraut bin, wusste ich nicht, dass das JSON -Modul für Python 2.6 nicht das 'Object_pairs_hook' enthält, daher musste ich SimpleJson für diesen Zweck installieren. Aus persönlicher Erfahrung verwende ich Deshalb von SimpleJson im Gegensatz zum Standard -JSON -Modul.