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?

War es hilfreich?

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 Sekunden

Einfache 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 Bau json Bei Lasten
  • simplejson ist etwa 30% schneller als der Bau json 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

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

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top