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?
Antworten
Zu viele Anzeigen?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
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.
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