415 Stimmen

Was sind die Unterschiede zwischen den Python-Modulen json und simplejson?

Ich habe viele Projekte gesehen, bei denen simplejson Modul anstelle von json Modul aus der Standardbibliothek. Außerdem gibt es viele verschiedene simplejson Module. Warum sollte man diese Alternativen verwenden, anstatt die der Standardbibliothek?

7voto

jjc Punkte 300

Eine API-Inkompatibilität, die ich mit Python 2.7 vs. simplejson 3.3.1 gefunden habe, besteht darin, ob die Ausgabe str oder unicode Objekte erzeugt. z.B..

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

gegen

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

Wenn die Präferenz ist, simplejson zu verwenden, dann kann dies durch Erzwingen des Arguments String zu Unicode, wie in angesprochen werden:

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

Für die Zwangsbehandlung ist es beispielsweise erforderlich, den ursprünglichen Zeichensatz zu kennen:

>>> 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 die "Won't-Fix". Ausgabe 40

6voto

A. Coady Punkte 49113

Ein weiterer Grund, warum Projekte simplejson verwenden, ist, dass das eingebaute json ursprünglich nicht seine C-Beschleunigungen enthielt, so dass der Leistungsunterschied spürbar war.

5voto

thedz Punkte 5396

Der eingebaute json Modul wurde in Python 2.6 aufgenommen. Alle Projekte, die Versionen von Python < 2.6 unterstützen, müssen einen Fallback haben. In vielen Fällen ist dieser Fallback simplejson .

4voto

Van Gale Punkte 42727

Hier ist (eine jetzt veraltet) Vergleich der Python json Bibliotheken:

JSON-Module für Python im Vergleich ( Archivverbindung )

Unabhängig von den Ergebnissen in diesem Vergleich sollten Sie die Standardbibliothek json verwenden, wenn Sie auf Python 2.6 sind. Andernfalls können Sie auch einfach simplejson verwenden.

3voto

jophine Punkte 564

json scheint schneller zu sein als simplejson in beiden Fällen von Ladungen und Dumps in der neuesten Version

Getestete Versionen:

  • python: 3.6.8
  • json: 2.0.9
  • simplejson: 3.16.0

Ergebnisse:

>>> def test(obj, call, data, times):
...   s = datetime.now()
...   print("calling: ", call, " in ", obj, " ", times, " times") 
...   for _ in range(times):
...     r = getattr(obj, call)(data)
...   e = datetime.now()
...   print("total time: ", str(e-s))
...   return r

>>> test(json, "dumps", data, 10000)
calling:  dumps  in  <module 'json' from 'C:\\Users\\jophine.antony\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\json\\__init__.py'>   10000  times
total time:  0:00:00.054857

>>> test(simplejson, "dumps", data, 10000)
calling:  dumps  in  <module 'simplejson' from 'C:\\Users\\jophine.antony\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\site-packages\\simplejson\\__init__.py'>   10000  times
total time:  0:00:00.419895
'{"1": 100, "2": "acs", "3.5": 3.5567, "d": [1, "23"], "e": {"a": "A"}}'

>>> test(json, "loads", strdata, 1000)
calling:  loads  in  <module 'json' from 'C:\\Users\\jophine.antony\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\json\\__init__.py'>   1000  times
total time:  0:00:00.004985
{'1': 100, '2': 'acs', '3.5': 3.5567, 'd': [1, '23'], 'e': {'a': 'A'}}

>>> test(simplejson, "loads", strdata, 1000)
calling:  loads  in  <module 'simplejson' from 'C:\\Users\\jophine.antony\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\site-packages\\simplejson\\__init__.py'>   1000  times
total time:  0:00:00.040890
{'1': 100, '2': 'acs', '3.5': 3.5567, 'd': [1, '23'], 'e': {'a': 'A'}}

Für Versionen:

  • python: 3.7.4
  • json: 2.0.9
  • simplejson: 3.17.0

json war beim Dump-Vorgang schneller als simplejson, aber beide waren beim Laden gleich schnell

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X