Question

Je l'ai vu de nombreux projets en utilisant simplejson module au lieu de json Module de la bibliothèque standard. En outre, il y a beaucoup de différents modules de simplejson. Pourquoi utiliserait ces solutions de rechange, au lieu de celui de la bibliothèque standard?

Était-ce utile?

La solution

json href="http://docs.python.org/whatsnew/2.6.html#the-json-module-javascript-object-notation" rel="noreferrer"> est simplejson, ajouté à la stdlib. Mais depuis json a été ajouté à 2,6, simplejson a l'avantage de travailler sur des versions plus Python (2.4+).

simplejson est également mis à jour plus fréquemment que Python, donc si vous avez besoin (ou voulez) la dernière version, il est préférable d'utiliser lui-même simplejson, si possible.

Une bonne pratique, à mon avis, est d'utiliser l'un ou l'autre comme solution de repli.

try:
    import simplejson as json
except ImportError:
    import json

Autres conseils

Je suis en désaccord avec les autres réponses: la construction dans json Bibliothèque (en Python 2.7) n'est pas nécessairement plus lent que simplejson . Il ne dispose pas de ce gênant bug unicode .

Voici une référence simple:

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)

Et les résultats sur mon système (Python 2.7.4, Linux 64 bits):

  

Les données du monde réel complexe:
        JSON décharges 1.56666707993 secondes
  simplejson décharges 2.25638604164 secondes
        charges JSON 2.71256899834 secondes
  charges simplejson 1.29233884811 secondes

     

données simple:
        JSON décharges 0.370109081268 secondes
  simplejson décharges 0.574181079865 secondes
        charges JSON 0.422876119614 secondes
  charges simplejson 0.270955085754 secondes

Pour le dumping, json est plus rapide que simplejson. Pour le chargement, simplejson est plus rapide.

Depuis que je suis en train de construire un service Web, dumps() est plus important et en utilisant une bibliothèque standard est toujours préférable.

En outre, cjson n'a pas été mis à jour au cours des 4 dernières années, donc je ne le toucher.

Toutes ces réponses ne sont pas très utiles, car ils sont temps sensibles .

Après avoir fait quelques recherches de mon propre je trouve que simplejson est bien plus rapide que le builtin, si vous tenir à jour à la dernière version.

pip/easy_install voulait installer 2.3.2 sur ubuntu 12.04, mais après avoir découvert la dernière version simplejson est en fait 3.3.0, donc je mis à jour et exécutiez les tests de temps.

  • simplejson est environ 3 fois plus rapide que le json builtin à des charges
  • simplejson est environ 30% plus rapide que la json builtin dans les dépotoirs

Disclaimer:

Les énoncés ci-dessus sont en python-2.7.3 et 3.3.0 simplejson (avec des accélérations c) Et pour que ma réponse est pas sensible au temps, vous devez exécuter vos propres tests pour vérifier car il varie tellement entre les versions; il n'y a pas de réponse facile qui ne sont pas sensibles au temps.

Comment savoir si C speedups sont activés dans simplejson:

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

Mise à jour: Je suis venu récemment dans une bibliothèque appelée ujson effectue ~ 3 fois plus rapide que simplejson avec certains tests de base.

J'ai JSON l'analyse comparative, simplejson et cjson.

  • cjson est le plus rapide
  • simplejson est presque à égalité avec cjson
  • JSON est d'environ 10 fois plus lent que 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

Certaines valeurs sont sérialisés différemment entre simplejson et JSON.

En particulier, sont sérialisés cas de collections.namedtuple sous forme de tableaux par json mais comme des objets par simplejson. Vous pouvez modifier ce comportement en passant namedtuple_as_object=False à simplejson.dump, mais par défaut, les comportements ne correspondent pas.

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

Une incompatibilité API j'ai trouvé, avec Python 2.7 vs simplejson 3.3.1 est si la sortie produit des objets str ou unicode. par exemple.

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

Si la préférence est d'utiliser simplejson, cela peut être résolu en forçant la chaîne d'arguments à unicode, comme dans:

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

La contrainte ne nécessite connaître le charset d'origine, par exemple:

>>> 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)

Ceci est le problème ne fixerai pas 40

Le module builtin json obtenu inclus dans Python 2.6. Tous les projets qui prennent en charge les versions de Python <2.6 besoin d'avoir une solution de repli. Dans de nombreux cas, ce repli est simplejson.

Une autre raison pour laquelle les projets utilisent simplejson est que le JSON builtin ne comprenait pas l'origine de ses C speedups, de sorte que la différence de performance est notable.

Voici (un jour maintenant) comparaison des bibliothèques Python JSON:

Comparaison des modules JSON pour python ( lien archives )

Quelles que soient les résultats de cette comparaison, vous devez utiliser la bibliothèque standard JSON si vous êtes sur Python 2.6. Et .. pourrait tout aussi bien utiliser simplejson autrement.

module simplejson est tout simplement 1,5 fois plus rapide que JSON (Sur mon ordinateur, avec simplejson 2.1.1 et Python 2.7 x86).

Si vous voulez, vous pouvez essayer la référence: http://abral.altervista.org /jsonpickle-bench.zip Sur mon simplejson PC est plus rapide que cPickle. Je voudrais savoir aussi vos repères!

Probablement, en tant que dit Coady, la différence entre simplejson et json est que simplejson comprend _speedups.c. Alors, pourquoi ne pas les développeurs utilisent python simplejson?

En python3, si vous une chaîne de b'bytes', avec json vous devez .decode() le contenu avant de pouvoir le charger. simplejson prend soin de cela, vous pouvez donc faire juste simplejson.loads(byte_string).

Je suis tombé sur cette question que je cherchais à installer simplejson pour Python 2.6. Je avais besoin d'utiliser le « object_pairs_hook » de json.load () pour charger un fichier JSON en tant OrderedDict. Être familier avec les versions plus récentes de Python Je ne savais pas que le module de JSON pour Python 2.6 ne comprend pas le « object_pairs_hook » donc je devais installer simplejson à cet effet. De son expérience personnelle c'est pourquoi j'utilise simplejson par opposition au module standard JSON.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top