Json ve simplejson Python modülleri arasındaki farklar nelerdir?


381

Standart Kütüphane'den simplejsonmodül yerine jsonmodül kullanan birçok proje gördüm . Ayrıca, birçok farklı simplejsonmodül var. Standart Kütüphanedeki yerine bu alternatifleri neden kullanasınız?

Yanıtlar:


391

json , simplejson stdlib'e eklenir. Ancak json2.6'da eklendiğinden beri , simplejsondaha fazla Python sürümü (2.4+) üzerinde çalışma avantajına sahiptir.

simplejsonayrıca Python'dan daha sık güncellenir, bu nedenle en son sürüme ihtiyacınız varsa (veya istiyorsanız), simplejsonmümkünse kendini kullanmak en iyisidir .

Bence iyi bir uygulama, birini ya da diğerini yedek olarak kullanmaktır.

try:
    import simplejson as json
except ImportError:
    import json

2
Şimdi sadece şikayet etmek durdurmak için pyflakes alabilir miyimredefinition of unused 'json'
James McMahon

5
Aynı veya uyumlu değiller, simplejson'da JSONDecodeError ve json'da ValueError var
Bjorn

3
@BjornTipling JSONDecodeErrorbir alt ValueError
sınıftır

30
Güncel bir Python'a sahip olduğunuzu varsayarak yukarıdaki cevaba katılmıyorum. Python 2.7'deki yerleşik (büyük artı !!!) Json kütüphanesi, simplejson kadar hızlıdır ve düzeltilmesi daha az unicode hataya sahip değildir.
Cevaba

1
Görünüşe göre Python2.7 json, yazı olarak mevcut simplejson v3.6.5'in çok gerisinde olan simplejson v2.0.9'u benimsedi. Ithalat simplejson
Kenji Noguchi

82

Diğer cevaplara katılmıyorum: yerleşik jsonkütüphane (Python 2.7) mutlaka daha yavaş değildir simplejson. Ayrıca bu sinir bozucu unicode hata yok .

İşte basit bir kıyaslama:

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)

Ve sistemimdeki sonuçlar (Python 2.7.4, Linux 64-bit):

Karmaşık gerçek dünya verileri:
json dökümleri 1.56666707993 saniye
simplejson dökümleri 2.25638604164 saniye
json yükleri 2.71256899834 saniye
simplejson yükleri 1.29233884811 saniye

Basit veriler:
json dökümleri 0.370109081268 saniye
simplejson dökümleri 0.574181079865 saniye
json yükleri 0.422876119614 saniye
simplejson yükleri 0.270955085754 saniye

Damping için, jsondaha hızlıdır simplejson. Yükleme simplejsoniçin daha hızlıdır.

Şu anda bir web hizmeti oluşturduğumdan, dumps()daha önemlidir - ve standart bir kütüphane kullanmak her zaman tercih edilir.

Ayrıca, cjsonson 4 yıl içinde güncellenmedi, bu yüzden dokunmazdım.


Bu yanıltıcı. Aşağıdaki cevabım bunun nedenini açıklıyor.
notbad.jpeg

2
Win7 bilgisayarımda (i7 CPU), json(CPython 3.5.0), basit | karmaşık dökümlerde% 68 |% 45 daha hızlı ve simplejsonkıyaslama kodunuzu kullanarak C hızlandırmaları ile basit | karmaşık yükler için% 35 |% 17 | Bu nedenle, bu kurulumda artık simplejson kullanmam.
mab

1
Ben sadece Python 3.6.1 üzerinde koştu ve jsonkazanır ya da tüm testler için aynıdır. Aslında jsonkarmaşık gerçek dünya veri damping testi iki kat daha hızlı biraz altında!
CpILL

27

Tüm bu cevaplar çok yararlı değil çünkü zamana duyarlılar .

Kendi I biraz araştırma yaptıktan sonra bulundu simplejson, gerçekten de daha hızlı yerleşiğine daha eğer bunu son sürüme güncellendi tutun.

pip/easy_installUbuntu 12.04 üzerine 2.3.2 yüklemek istedim, ancak en son simplejsonsürümü bulduktan sonra aslında 3.3.0, bu yüzden güncelledim ve zaman testlerini yeniden düzenledim.

  • simplejsonjsonyüklerde yerleşik olandan yaklaşık 3 kat daha hızlı
  • simplejsonjsonçöplükte yerleşik olandan yaklaşık% 30 daha hızlı

Yasal Uyarı:

Yukarıdaki ifadeler python-2.7.3 ve simplejson 3.3.0'dadır (c hızlandırmaları ile) Ve cevabımın da zamana duyarlı olmadığından emin olmak için, sürümler arasında çok değiştiği için kontrol etmek için kendi testlerinizi yapmalısınız; zamana duyarlı olmayan kolay bir cevap yoktur.

Simplejson'da C hızlanmalarının etkin olup olmadığı nasıl anlaşılır:

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

GÜNCELLEME: Son zamanlarda ujson adında simplejson, bazı temel testlerden ~ 3 kat daha hızlı performans gösteren bir kütüphane ile karşılaştım.


Ujson'dan bahsettiğiniz için teşekkürler. Bu beni daha iyi muhafaza görünüyor başka bir kütüphane RapidJSON götürdü
MCMZL

"simplejson 3.3.0 (c hızları ile)" oh gerçekten? daha dürüst olun ve c hızlanmadan test edin.
Reishin

ujson kullanmayın, hatalar ve bellek sızıntıları ve çökmeleri ile doludur ve bir süredir güncellenmemiştir. Biz hendek ve json daha fazla işlevselliği vardır ve güncellenmiş olarak
simplejson geçti

21

Ben json, simplejson ve cjson'u karşılaştırıyorum.

  • cjson en hızlı
  • simplejson neredeyse cjson ile eşit
  • json, simplejson'dan yaklaşık 10 kat daha yavaştır

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

6
Lütfen gerçek test modülü için bir pastie ekleyin.
Tal Weiss

4
Python'un hangi sürümleri ve söz konusu kütüphaneler?
Anentropik

6
Bu artık doğru değil. python2.7'deki json performans geliştirmeleridir.
zengr

11

Bazı değerler simplejson ve json arasında farklı şekilde serileştirilir.

Özellikle, örnekleri collections.namedtupletarafından diziler olarak, jsonancak nesneler olarak serileştirilir simplejson. Sen ileterek bu davranışı geçersiz kılabilirsiniz namedtuple_as_object=Falseiçin simplejson.dump, ancak varsayılan olarak davranışlar uyuşmuyor.

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

7

Python 2.7 vs simplejson 3.3.1 ile bulduğum bir API uyumsuzluğu, çıktının str veya unicode nesneleri üretip üretmediğidir. Örneğin

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

Tercih simplejson kullanmaksa, bu, argüman dizesini unicode'a zorlayarak aşağıdaki gibi ele alınabilir:

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

Baskı orijinal karakter setini bilmeyi gerektirir, örneğin:

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

Bu, düzeltilmeyecek bir sorundur 40


6

Projelerin simplejson kullanmasının bir başka nedeni, yerleşik json'un başlangıçta C hızlarını içermemesidir, bu nedenle performans farkı göze çarpıyordu.


5

Yerleşik jsonmodül Python 2.6'ya dahil edildi. Python <2.6 sürümlerini destekleyen tüm projelerin yedeği olmalıdır. Birçok durumda, bu geri dönüş simplejson.



2

simplejson modülü, json'dan 1,5 kat daha hızlıdır (Bilgisayarımda, simplejson 2.1.1 ve Python 2.7 x86 ile).

İsterseniz, karşılaştırmayı deneyebilirsiniz: http://abral.altervista.org/jsonpickle-bench.zip Bilgisayarımda simplejson cPickle'dan daha hızlı. Kriterlerinizi de bilmek isterim!

Muhtemelen, Coady'nin dediği gibi, simplejson ve json arasındaki fark, simplejson'un _speedups.c'yi içermesidir. Peki, neden python geliştiricileri simplejson kullanmıyor?


2

Python3 içinde, eğer bir dize iseniz, onu yükleyebilmeniz için önce içeriğe b'bytes'sahip jsonolmanız gerekir .decode(). simplejsonbununla ilgilenir, böylece sadece yapabilirsiniz simplejson.loads(byte_string).


3.6: s sürümünde değiştirilenler artık bayt veya bytearray türünde olabilir. Giriş kodlaması UTF-8, UTF-16 veya UTF-32 olmalıdır.
Mathieu Longtin

1

jsonsimplejsonen son sürümdeki her iki yükleme ve boşaltma durumundan daha hızlı görünüyor

Test edilmiş sürümler:

  • piton: 3.6.8
  • json: 2.0.9
  • simplejson: 3.16.0

Sonuçlar:

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

Sürümler için:

  • piton: 3.7.4
  • json: 2.0.9
  • simplejson: 3.17.0

Json, boşaltma işlemi sırasında simplejson'dan daha hızlıydı, ancak her ikisi de yük işlemleri sırasında aynı hızı korudu


0

Python 2.6 için simplejson kurmak istediğim için bu soruya rastladım. Bir jered dosyasını OrderedDict olarak yüklemek için json.load () 'object_pairs_hook' kullanmak gerekiyordu. Python'un daha yeni sürümlerine aşina olmak, Python 2.6 için json modülünün 'object_pairs_hook' içermediğini fark etmedim, bu nedenle bu amaçla simplejson'u kurmak zorunda kaldım. Kişisel deneyimlerden bu yüzden standart json modülünün aksine simplejson kullanıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.