আমি simplejson
পরিবর্তে মডিউল ব্যবহার করে অনেক প্রকল্প দেখেছিjson
স্ট্যান্ডার্ড লাইব্রেরি থেকে । এছাড়াও, অনেকগুলি বিভিন্ন simplejson
মডিউল রয়েছে। স্ট্যান্ডার্ড লাইব্রেরির পরিবর্তে এই বিকল্পগুলি কেন ব্যবহার করা হবে?
আমি simplejson
পরিবর্তে মডিউল ব্যবহার করে অনেক প্রকল্প দেখেছিjson
স্ট্যান্ডার্ড লাইব্রেরি থেকে । এছাড়াও, অনেকগুলি বিভিন্ন simplejson
মডিউল রয়েছে। স্ট্যান্ডার্ড লাইব্রেরির পরিবর্তে এই বিকল্পগুলি কেন ব্যবহার করা হবে?
উত্তর:
json
হয় simplejson
, stdlib যোগ। তবে যেহেতু json
২.6-এ যুক্ত হয়েছিল,simplejson
আরও পাইথন সংস্করণে (২.৪+) কাজ করার সুবিধা রয়েছে।
simplejson
পাইথনের চেয়েও ঘন ঘন আপডেট করা হয়, তাই আপনার যদি সর্বশেষতম সংস্করণ প্রয়োজন হয় (বা চান) তবে এটি ব্যবহার করা ভাল simplejson
, সম্ভব হলে নিজেই ।
একটি ভাল অনুশীলন, আমার মতে, একটি বা অন্যটিকে ফ্যালব্যাক হিসাবে ব্যবহার করা।
try:
import simplejson as json
except ImportError:
import json
JSONDecodeError
একটি উপশ্রেণী হয়ValueError
আমি অন্যান্য উত্তরগুলির সাথে একমত নই: json
গ্রন্থাগারটিতে নির্মিত (পাইথন ২.7-এ) অগত্যা তুলনায় ধীর নয় simplejson
। এছাড়া নেই এই বিরক্তিকর ইউনিকোড বাগ ।
এখানে একটি সাধারণ মানদণ্ড দেওয়া হল:
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)
এবং আমার সিস্টেমে ফলাফল (পাইথন ২.7.৪, লিনাক্স 64৪-বিট):
জটিল জগতের ডেটা:
জসন ডাম্প 1.56666707993 সেকেন্ড
সিম্পজসন ডাম্পস ২২.২63638841০৪64৪ সেকেন্ড
জেসন লোড করে ২.7১২568৮99৮৮৪৩ সেকেন্ড
simplejson লোড 1,29233884811 সেকেন্ডসাধারণ ডেটা:
জেসন ডাম্প 0.370109081268 সেকেন্ড
সিম্পিজন ডাম্প 0.574181079865 সেকেন্ড
জেসন লোড হয় 0.422876119614 সেকেন্ড
সিম্পলসন লোড হয় 0.270955085754 সেকেন্ড
ডাম্পিংয়ের জন্য, এর json
চেয়ে দ্রুত simplejson
। লোড করার জন্য, simplejson
দ্রুত।
যেহেতু আমি বর্তমানে একটি ওয়েব পরিষেবা তৈরি করছি, dumps()
এটি আরও গুরুত্বপূর্ণ — এবং একটি মানক লাইব্রেরি ব্যবহার সর্বদা পছন্দ করা হয়।
এছাড়াও, cjson
গত 4 বছরে আপডেট হয়নি, তাই আমি এটি স্পর্শ করব না।
json
(সিপিথন 3.5.0) simplejson
আপনার বেনমার্ক কোডটি ব্যবহার করে সি স্পীডআপ সহ সহজ | জটিল ডাম্পগুলিতে 68% | 45% দ্রুত এবং 35% | 17% দ্রুত wr অতএব, আমি এই সেটআপটি দিয়ে সিম্পজসন আর ব্যবহার করব না।
json
বা সমস্ত পরীক্ষার জন্য একই। json
জটিল রিয়েল ওয়ার্ল্ড ডেটা ডাম্প টেস্টের তুলনায় আসলে দ্বিগুণ চেয়ে কম!
এই সমস্ত উত্তর খুব কার্যকর না কারণ তারা সময় সংবেদনশীল ।
আমার নিজের কিছু গবেষণা করার পরে আমি দেখতে পেলাম যে simplejson
এটি বিল্টিনের তুলনায় সত্যই দ্রুত, যদি আপনি এটি সর্বশেষতম সংস্করণে আপডেট রাখেন ।
pip/easy_install
উবুন্টু ১২.০৪-তে ২.৩.২ ইনস্টল করতে চেয়েছিলেন, তবে সর্বশেষ simplejson
সংস্করণটি সন্ধান করার পরে আসলে ৩.৩.০, তাই আমি এটি আপডেট করেছি এবং সময় পরীক্ষার পুনরায় চেষ্টা করেছি।
simplejson
json
লোড এ বিল্টিনের চেয়ে প্রায় 3x গতিযুক্তsimplejson
json
ডাম্পগুলিতে বিল্টিনের তুলনায় প্রায় 30% দ্রুতউপরের বিবৃতিগুলি পাইথন -২.7.৩ এবং সিম্পজসন ৩.৩.০ (সি স্পিডআপস সহ) এবং আমার উত্তরটিও সময় সংবেদনশীল নয় তা নিশ্চিত করার জন্য, সংস্করণগুলির মধ্যে এত বেশি পরিবর্তিত হওয়ার কারণে আপনার নিজের পরীক্ষা চালানো উচিত ; এমন কোনও সহজ উত্তর নেই যা সময় সংবেদনশীল নয়।
import simplejson
# If this is True, then c speedups are enabled.
print bool(getattr(simplejson, '_speedups', False))
আপডেট: আমি সম্প্রতি উজসন নামে একটি লাইব্রেরি জুড়ে এসেছি simplejson
যা কিছু বেসিক পরীক্ষাগুলির চেয়ে ~ 3x দ্রুততর সম্পাদন করছে ।
আমি জেনসন, সিম্পজসন এবং সিজেসনকে বেঞ্চমার্কিং করছি।
$ 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
কিছু মান সিম্পজসন এবং জসন এর মধ্যে পৃথকভাবে সিরিয়ালযুক্ত হয়।
উল্লেখযোগ্যভাবে, উদাহরণগুলি collections.namedtuple
অ্যারে হিসাবে সিরিয়ালায়িত হয় json
তবে বস্তু দ্বারা simplejson
। আপনি পাশ দিয়ে এই আচরণ পাল্টাতে পারেন namedtuple_as_object=False
করার simplejson.dump
, কিন্তু ডিফল্ট ভাবে আচরণ মিলছে না।
>>> 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 বনাম সিম্পজসন ৩.৩.১ সহ একটি এপিআই অসম্পূর্ণতা পেয়েছি আউটপুটটি স্ট্রিং বা ইউনিকোড অবজেক্ট তৈরি করে কিনা। যেমন
>>> from json import JSONDecoder
>>> jd = JSONDecoder()
>>> jd.decode("""{ "a":"b" }""")
{u'a': u'b'}
বনাম
>>> from simplejson import JSONDecoder
>>> jd = JSONDecoder()
>>> jd.decode("""{ "a":"b" }""")
{'a': 'b'}
যদি সিম্পলজসন ব্যবহারের পছন্দটি হয় তবে যুক্তি স্ট্রিংটিকে ইউনিকোডে চাপিয়ে দিয়ে এটিকে মোকাবেলা করা যেতে পারে, যেমন:
>>> from simplejson import JSONDecoder
>>> jd = JSONDecoder()
>>> jd.decode(unicode("""{ "a":"b" }""", "utf-8"))
{u'a': u'b'}
জবরদস্তির জন্য মূল চরসেটটি জানা দরকার, উদাহরণস্বরূপ:
>>> 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)
এটিই 40 এর সমস্যা সমাধান করবে না
পাইথন জেসন লাইব্রেরির তুলনায় এখানে (এখন পুরানো)
পাইথনের জন্য জেএসএন মডিউলগুলির তুলনা ( সংরক্ষণাগার লিঙ্ক) )
এই তুলনার ফলাফল নির্বিশেষে আপনি পাইথন ২.6 এ থাকলে আপনার স্ট্যান্ডার্ড লাইব্রেরি json ব্যবহার করা উচিত। এবং .. পাশাপাশি কেবল অন্যথায় সিম্পজসন ব্যবহার করতে পারে।
সিম্পজসন মডিউলটি জসনের তুলনায় ১,৫ গুণ দ্রুত (আমার কম্পিউটারে সিম্পজসন ২.১.১ এবং পাইথন ২.7 x86 সহ)।
আপনি যদি চান, আপনি বেঞ্চমার্কটি চেষ্টা করতে পারেন: http://abral.altervista.org/jsonpickle-bench.zip আমার পিসিতে সিম্পলসন সিপিকেলের চেয়ে দ্রুত। আমি আপনার মানদণ্ডগুলিও জানতে চাই!
সম্ভবত, কোডি যেমন বলেছিলেন, সিম্পজসন এবং জসন এর মধ্যে পার্থক্য হ'ল সিম্পজসনটিতে _ স্পিডআপস.সি অন্তর্ভুক্ত রয়েছে। তো, পাইথন বিকাশকারীরা সিম্পজসন ব্যবহার করবেন না কেন?
Python3 মধ্যে, আপনি যদি একটি স্ট্রিং b'bytes'
সঙ্গে json
আপনি করতে হবে .decode()
বিষয়বস্তু আগে আপনি এটা লোড করতে পারেন। simplejson
আপনি যত্ন নিতে পারেন যাতে এটি যত্ন নেয় simplejson.loads(byte_string)
।
json
চেয়ে দ্রুত বলে মনে হচ্ছে simplejson
সর্বশেষ সংস্করণে বোঝা এবং ডাম্প উভয়ের ক্ষেত্রেই
পরীক্ষিত সংস্করণ:
ফলাফল:
>>> 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'}}
সংস্করণগুলির জন্য:
ডাম্প অপারেশনের সময় জেসন সিম্পজসনের চেয়ে দ্রুত ছিল তবে লোড অপারেশনের সময় উভয়ই একই গতি বজায় রেখেছিল
পাইথন ২.6-এর জন্য সিম্পজসন ইনস্টল করতে গিয়ে আমি এই প্রশ্নটি জুড়ে এসেছি। অর্ডারডিক্ট হিসাবে কোনও জেসন ফাইল লোড করার জন্য আমার জেসন.লোড () এর 'অবজেক্ট_পেইস_হুক' ব্যবহার করা দরকার। পাইথনের আরও সাম্প্রতিক সংস্করণগুলির সাথে পরিচিত হয়ে আমি বুঝতে পারি নি যে পাইথন ২.6 এর জেএসন মডিউলটিতে 'অবজেক্ট_পেইস_হুক' অন্তর্ভুক্ত নেই তাই এই উদ্দেশ্যে আমাকে সরলজসন ইনস্টল করতে হয়েছিল। ব্যক্তিগত অভিজ্ঞতা থেকে এই কারণেই আমি স্ট্যান্ডার্ড জেসন মডিউলটির বিপরীতে সিম্পজসন ব্যবহার করি।
redefinition of unused 'json'