45 votes

Performances de décodage JSON Python

Je suis à l'aide de l' json module en Python 2.6 pour charger et de décoder des fichiers JSON. Cependant, je suis actuellement à obtenir plus lent que prévu de la performance. Je suis à l'aide d'un cas de test qui est de 6 MO en taille et en json.loads() prend 20 secondes.

J'ai pensé que l' json module a du code natif pour accélérer le décodage?

Comment puis-je vérifier si ce qui est utilisé?

A titre de comparaison, j'ai téléchargé et installé l' python-cjson module cjson.decode() prend 1 seconde pour le même cas de test.

Je préfère utiliser le JSON module fourni avec la version 2.6 de Python, de sorte que les utilisateurs de mon code n'est pas nécessaire d'installer d'autres modules.

(Je suis en développement sur Mac OS X, mais j'obtiens un résultat similaire sur Windows XP).

31voto

Ivo Danihelka Points 1770

La nouvelle bibliothèque Yajl - Yet Another est très rapide.

 yajl        serialize: 0.180  deserialize: 0.182  total: 0.362
simplejson  serialize: 0.840  deserialize: 0.490  total: 1.331
stdlib json serialize: 2.812  deserialize: 8.725  total: 11.537
 

Vous pouvez comparer les bibliothèques vous-même .

Mise à jour: UltraJSON est encore plus rapide.

23voto

Coady Points 11374

Cela peut varier en fonction de la plate-forme, mais le module json intégré est basé sur simplejson , sans les accélérations C. De toute façon, j’ai trouvé simplejson aussi rapide que python-cjson, je le préfère donc car il a évidemment la même interface que celle intégrée.

 try:
    import simplejson as json
except ImportError:
    import json
 

Il me semble que c'est le meilleur idiome pendant un certain temps, offrant les performances disponibles, tout en étant compatible avec la transmission à venir.

17voto

Tomas Points 135

Je analysais le même fichier 10x. La taille du fichier était de 1 856 944 octets.

Python 2.6:

 yajl        serialize: 0.294  deserialize: 0.334  total: 0.627
cjson       serialize: 0.494  deserialize: 0.276  total: 0.769
simplejson  serialize: 0.554  deserialize: 0.268  total: 0.823
stdlib json serialize: 3.917  deserialize: 17.508 total: 21.425
 

Python 2.7:

 yajl        serialize: 0.289  deserialize: 0.312  total: 0.601
cjson       serialize: 0.232  deserialize: 0.254  total: 0.486
simplejson  serialize: 0.288  deserialize: 0.253  total: 0.540
stdlib json serialize: 0.273  deserialize: 0.256  total: 0.528
 

Vous ne savez pas pourquoi les chiffres sont disproportionnés par rapport à vos résultats. Je suppose, les nouvelles bibliothèques?

15voto

TONy.W Points 817

jetez un oeil sur UltraJSON https://github.com/esnme/ultrajson

voici mon test (code à partir de: https://gist.github.com/lightcatcher/1136415 )

plate-forme: Intel Core i7 à 2,2 GHz pour OS X 10.8.3 MBP

JSON:

simplejson == 3.1.0

python-cjson == 1.0.5

jsonlib == 1.6.1

nombre == 1,30

yajl == 0.3.5

 JSON Benchmark
2.7.2 (default, Oct 11 2012, 20:14:37)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)]
-----------------------------
ENCODING
simplejson: 0.293394s
cjson: 0.461517s
ujson: 0.222278s
jsonlib: 0.428641s
json: 0.759091s
yajl: 0.388836s

DECODING
simplejson: 0.556367s
cjson: 0.42649s
ujson: 0.212396s
jsonlib: 0.265861s
json: 0.365553s
yajl: 0.361718s
 

2voto

gimel Points 30150

En regardant dans mon installation de Python 2.6.1 sur Windows, le json des charges de l'emballage _json module, qui est intégré dans le moteur d' exécution. C source pour le module json speedups ici .

 >>> import _json
>>> _json
<module '_json' (built-in)>
>>> print _json.__doc__
json speedups
>>> dir(_json)
['__doc__', '__name__', '__package__', 'encode_basestring_ascii', 'scanstring']
>>>
 

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