413 votes

Quelles sont les différences entre json et simplejson modules Python?

J'ai vu beaucoup de projets qui utilisent externe simplejson module à la place de json module de Python Standard Library. Aussi il ya beaucoup de différents simplejson modules.

Quels sont les avantages d' simplejson et de mise en œuvre qui est bon?
Pourquoi ne pas simplement utiliser la norme json module?

421voto

Devin Jeanpierre Points 23162

json est simplejson, ajouté à la stdlib. Mais depuis json a été ajouté en 2.6, simplejson a l'avantage de travailler sur plusieurs versions de Python (2.4+).

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

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

try: import simplejson as json
except ImportError: import json

88voto

Tal Weiss Points 2763

Je suis en désaccord avec les réponses ci-dessus. Le bâti de la librairie json en Python 2.7 est aussi rapide que simplejson mais sans ennuyeux refusé-à-être-fixe unicode bugs.

Voici un simple indice de référence (veuillez essayer ceci sur votre système):

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

Complexe des données du monde réel:
json décharges 1.56666707993 secondes
simplejson décharges 2.25638604164 secondes
json charges 2.71256899834 secondes
simplejson charges 1.29233884811 secondes

De données Simple:
json décharges 0.370109081268 secondes
simplejson décharges 0.574181079865 secondes
json charges 0.422876119614 secondes
simplejson charges 0.270955085754 secondes

Pour le dumping, json plus rapide que de l' simplejson (mais pas par un ordre de grandeur). Pour le chargement, simplejson est plus rapide (mais pas par un ordre de grandeur).

Depuis que je suis en train de construire un service web, dumps() qui est plus important-et à l'aide d'une bibliothèque standard est toujours préféré.

Aussi, cjson n'a pas été mis à jour dans les 4 dernières années, je ne voudrais pas y toucher.

29voto

notbad.jpeg Points 911

L'ensemble de ces réponses ne sont pas très utiles, car ils sont sensibles au temps.

Après avoir fait quelques recherches de mon côté je trouve qu' simplejson est en effet plus rapide que la builtin, si vous garder à jour à la dernière version.

pip/easy_install voulu installer 2.3.2 sur ubuntu 12.04, mais après la découverte de la dernière simplejson version est en fait 3.3.0, j'ai donc mis à jour, et rediffusé le temps des tests.

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

Avertissement:

Les déclarations ci-dessus sont en python 2.7.3 et simplejson 3.3.0 (avec c la vitesse) Et pour m'assurer que ma réponse n'est pas également sensible au temps, vous devez exécuter vos propres tests pour vérifier, car il varie beaucoup entre les versions; il n'y a pas de réponse facile qui n'est pas sensible au temps.

Comment savoir si C accélérations sont activés dans simplejson:

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

20voto

Chris Points 290

J'ai été benchmarking json, simplejson et cjson.

  • cjson est plus rapide
  • simplejson est presque à égalité avec cjson
  • json est d'environ 10x plus lent que simplejson

http://pastie.org/1507411

5voto

thedz Points 3494

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X