Eu já vi muitos projetos usando o simplejson
módulo em vez do json
módulo da Biblioteca Padrão. Além disso, existem muitos simplejson
módulos diferentes . Por que usar essas alternativas, em vez da alternativa na Biblioteca Padrão?
python
json
simplejson
Lakshman Prasad
fonte
fonte
redefinition of unused 'json'
JSONDecodeError
é uma subclasse deValueError
Eu tenho que discordar das outras respostas: a
json
biblioteca interna (no Python 2.7) não é necessariamente mais lenta quesimplejson
. Ele também não possui esse bug unicode irritante .Aqui está uma referência simples:
E os resultados no meu sistema (Python 2.7.4, Linux de 64 bits):
Para dumping,
json
é mais rápido quesimplejson
. Para carregar,simplejson
é mais rápido.Como atualmente estou construindo um serviço da Web,
dumps()
é mais importante - e sempre é preferível o uso de uma biblioteca padrão.Além disso,
cjson
não foi atualizado nos últimos 4 anos, por isso não o toquei.fonte
json
(CPython 3.5.0) é 68% | 45% mais rápido em despejos simples e complexos e 35% em 17% em cargas simples e complexas wrtsimplejson
v3.8.0 com acelerações C usando seu código de referência. Portanto, eu não usaria mais o simplejson nessa configuração.json
ganha ou é o mesmo para todos os testes. De fato,json
é um pouco menos do que o dobro do teste complexo de despejo de dados do mundo real!Todas essas respostas não são muito úteis porque são sensíveis ao tempo .
Depois de fazer algumas pesquisas, descobri que
simplejson
é realmente mais rápido que o incorporado, se você o mantiver atualizado para a versão mais recente.pip/easy_install
queria instalar o 2.3.2 no ubuntu 12.04, mas depois de descobrir asimplejson
versão mais recente é realmente a 3.3.0, então eu a atualizei e refiz os testes de tempo.simplejson
é cerca de 3x mais rápido que o embutidojson
em cargassimplejson
é cerca de 30% mais rápido que o embutidojson
nos lixõesAviso Legal:
As instruções acima estão em python-2.7.3 e simplejson 3.3.0 (com acelerações c) E para garantir que minha resposta também não seja sensível ao tempo, você deve executar seus próprios testes para verificar, pois varia muito entre as versões; não há uma resposta fácil que não seja sensível ao tempo.
Como saber se as acelerações C estão ativadas no simplejson:
UPDATE: Recentemente, deparei-me com uma biblioteca chamada ujson que está executando ~ 3x mais rápido do que
simplejson
em alguns testes básicos.fonte
Estive comparando json, simplejson e cjson.
http://pastie.org/1507411 :
fonte
Alguns valores são serializados de maneira diferente entre simplejson e json.
Notavelmente, as instâncias de
collections.namedtuple
são serializadas como matrizes por,json
mas como objetos porsimplejson
. Você pode substituir esse comportamento passandonamedtuple_as_object=False
parasimplejson.dump
, mas por padrão os comportamentos não coincidem.fonte
Uma incompatibilidade de API que encontrei, com Python 2.7 vs simplejson 3.3.1, é se a saída produz objetos str ou unicode. por exemplo
vs
Se a preferência for usar simplejson, isso poderá ser resolvido coagindo a cadeia de argumentos a unicode, como em:
A coerção exige conhecer o conjunto de caracteres original, por exemplo:
Este é o problema não corrigido 40
fonte
Outro motivo pelo qual os projetos usam o simplejson é que o json interno não incluía originalmente suas acelerações em C, portanto a diferença de desempenho era perceptível.
fonte
O
json
módulo embutido foi incluído no Python 2.6. Todos os projetos que suportam versões do Python <2.6 precisam ter um fallback. Em muitos casos, esse fallback ésimplejson
.fonte
Aqui está (uma desatualizada) comparação das bibliotecas Python json:
Comparando Módulos JSON para Python ( link do arquivo morto) )
Independentemente dos resultados desta comparação, você deve usar a biblioteca padrão json se estiver no Python 2.6. E .. pode muito bem apenas usar simplejson caso contrário.
fonte
O módulo simplejson é simplesmente 1,5 vezes mais rápido que o json (no meu computador, com o simplejson 2.1.1 e o Python 2.7 x86).
Se desejar, você pode tentar o benchmark: http://abral.altervista.org/jsonpickle-bench.zip No meu PC, o simplejson é mais rápido que o cPickle. Gostaria de conhecer também seus benchmarks!
Provavelmente, como disse Coady, a diferença entre simplejson e json é que simplejson inclui _speedups.c. Então, por que os desenvolvedores python não usam o simplejson?
fonte
No python3, se você tiver uma sequência de
b'bytes'
,json
precisará.decode()
do conteúdo antes de poder carregá-lo.simplejson
cuida disso para que você possa fazersimplejson.loads(byte_string)
.fonte
json
parece mais rápido quesimplejson
nos dois casos de cargas e lixões na versão mais recenteVersões testadas:
Resultados:
Para versões:
O json foi mais rápido que o simplejson durante a operação de despejo, mas ambos mantiveram a mesma velocidade durante as operações de carregamento
fonte
Me deparei com essa pergunta, pois estava procurando instalar o simplejson para Python 2.6. Eu precisava usar o 'object_pairs_hook' de json.load () para carregar um arquivo json como um OrderedDict. Por estar familiarizado com versões mais recentes do Python, não percebi que o módulo json para o Python 2.6 não inclui o 'object_pairs_hook', portanto tive que instalar o simplejson para esse fim. Por experiência pessoal, é por isso que eu uso simplejson em oposição ao módulo json padrão.
fonte