Standart Kütüphane'den simplejson
modül yerine json
modül kullanan birçok proje gördüm . Ayrıca, birçok farklı simplejson
modül var. Standart Kütüphanedeki yerine bu alternatifleri neden kullanasınız?
Standart Kütüphane'den simplejson
modül yerine json
modül kullanan birçok proje gördüm . Ayrıca, birçok farklı simplejson
modül var. Standart Kütüphanedeki yerine bu alternatifleri neden kullanasınız?
Yanıtlar:
json
, simplejson
stdlib'e eklenir. Ancak json
2.6'da eklendiğinden beri , simplejson
daha fazla Python sürümü (2.4+) üzerinde çalışma avantajına sahiptir.
simplejson
ayrıca Python'dan daha sık güncellenir, bu nedenle en son sürüme ihtiyacınız varsa (veya istiyorsanız), simplejson
mü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
JSONDecodeError
bir alt ValueError
Diğer cevaplara katılmıyorum: yerleşik json
kü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 saniyeBasit 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, json
daha hızlıdır simplejson
. Yükleme simplejson
iç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, cjson
son 4 yıl içinde güncellenmedi, bu yüzden dokunmazdım.
json
(CPython 3.5.0), basit | karmaşık dökümlerde% 68 |% 45 daha hızlı ve simplejson
kı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.
json
kazanır ya da tüm testler için aynıdır. Aslında json
karmaşık gerçek dünya veri damping testi iki kat daha hızlı biraz altında!
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_install
Ubuntu 12.04 üzerine 2.3.2 yüklemek istedim, ancak en son simplejson
sürümü bulduktan sonra aslında 3.3.0, bu yüzden güncelledim ve zaman testlerini yeniden düzenledim.
simplejson
json
yüklerde yerleşik olandan yaklaşık 3 kat daha hızlısimplejson
json
çöplükte yerleşik olandan yaklaşık% 30 daha hızlı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.
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.
Ben json, simplejson ve cjson'u karşılaştırıyorum.
$ 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
Bazı değerler simplejson ve json arasında farklı şekilde serileştirilir.
Özellikle, örnekleri collections.namedtuple
tarafından diziler olarak, json
ancak nesneler olarak serileştirilir simplejson
. Sen ileterek bu davranışı geçersiz kılabilirsiniz namedtuple_as_object=False
iç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]'
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
Python json kütüphanelerinin karşılaştırması (şimdi güncel değil):
Python için JSON modüllerini karşılaştırma ( arşiv bağlantısı )
Bu karşılaştırmada elde edilen sonuçlara bakılmaksızın, Python 2.6 üzerindeyseniz standart json kütüphanesini kullanmalısınız. Ve .. aksi takdirde sadece simplejson kullanabilirsiniz.
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?
Python3 içinde, eğer bir dize iseniz, onu yükleyebilmeniz için önce içeriğe b'bytes'
sahip json
olmanız gerekir .decode()
. simplejson
bununla ilgilenir, böylece sadece yapabilirsiniz simplejson.loads(byte_string)
.
json
simplejson
en son sürümdeki her iki yükleme ve boşaltma durumundan daha hızlı görünüyor
Test edilmiş sürümler:
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:
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
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.
redefinition of unused 'json'