আচার বা জেসন?


114

আমি ডিস্কে একটু সংরক্ষণ করতে হবে dictবস্তুর যার চাবি ধরনের strএবং মান intগুলি এবং তারপর তা পুনরুদ্ধার । এটার মতো কিছু:

{'juanjo': 2, 'pedro':99, 'other': 333}

সেরা বিকল্পটি কী এবং কেন? এর সাথে pickleনাকি সিরিয়াল করবেন simplejson?

আমি পাইথন ২.6 ব্যবহার করছি।


এটা কি রূপান্তর? এছাড়াও, কোন অর্থে ভাল ?
সাইলেন্টগোস্ট

10
২.6-এ আপনি ব্যবহার করবেন না simplejson, আপনি বিল্টিন jsonমডিউলটি ব্যবহার করবেন (যার ঠিক একই ইন্টারফেস রয়েছে)।
মাইক গ্রাহাম

5
"বেস্ট"? কিসের জন্য সেরা? গতি? জটিলতা? নমনীয়তা? কস্ট?
এস .লট


@ ট্রিলারিয়ন: ওয়াইএএমএল জেএসএন
মার্টিন থোমা

উত্তর:


68

আপনার যদি কোনও আন্তঃআকক্ষীয়তা প্রয়োজনীয়তা না থাকে (যেমন আপনি পাইথনের সাথে ডেটা ব্যবহার করতে যাচ্ছেন) এবং একটি বাইনারি ফর্ম্যাটটি ভাল, সিপিকেলের সাথে যান যা আপনাকে সত্যই দ্রুত পাইথন অবজেক্ট সিরিয়ালাইজেশন দেয়।

আপনি যদি আন্তঃঅযুক্তি চান বা আপনার ডেটা সঞ্চয় করার জন্য কোনও পাঠ্য বিন্যাস চান, তবে JSON (বা আপনার সীমাবদ্ধতার উপর নির্ভর করে কিছু অন্যান্য উপযুক্ত বিন্যাস) নিয়ে যান।


48
তাদেরকে JSON দ্রুত হবে বলে মনে হয় cPickle হয়।
ম্যাক

5
আমার উত্তর উদ্বেগকে হাইলাইট করে যা আমি মনে করি যে দু'টি সমাধান চয়ন করার সময় বিবেচনা করা সবচেয়ে গুরুত্বপূর্ণ। অন্যজনের চেয়ে দ্রুত হওয়া সম্পর্কে আমি কোনও দাবি করি না। যদি JSON দ্রুত এবং অন্যথায় উপযুক্ত হয় তবে JSON এর সাথে যান! (অর্থাত্, আপনার ডাউন-ভোটের কোনও কারণ নেই))
হাভার্ড এস

10
আমার বক্তব্যটি হল: জেএসওএন-এর উপরে আপনার প্রাঙ্গণের উপর ভিত্তি করে cPickle(বা pickle) ব্যবহারের কোনও আসল কারণ নেই । আমি যখন আপনার উত্তরটি প্রথম পড়লাম তখন আমি ভেবেছিলাম কারণটি সম্ভবত গতি হতে পারে তবে যেহেতু এটি ঘটনাটি নয় ... :)
ম্যাক

14
@ ম্যাক দ্বারা উদ্ধৃত মানদণ্ড কেবল স্ট্রিং পরীক্ষা করে। আমি স্ট্রিং, ইন্টি এবং ফ্লোটকে আলাদাভাবে পরীক্ষা করেছি এবং জানতে পেরেছি যে জেসন ফ্লোট সিরিয়ালাইজেশনের সাথে সিপিকেলের চেয়ে ধীর, তবে ফ্লোট আনসিরিয়ালেসনের সাথে দ্রুত। ইন্ট (এবং স্ট্র) এর জন্য, জসন দুটি উপায়েই দ্রুত is ডেটা এবং কোড: gist.github.com/marians/f1314446b8bf4d34e782
মারিয়ান

24
সিপিকেলের সর্বশেষ প্রোটোকলটি এখন জেএসএনের চেয়ে দ্রুত is জেএসএন দ্রুত হওয়ার বিষয়ে আপ-ভোট দেওয়া মন্তব্যটি কয়েক বছরের মধ্যে পুরানো। stackoverflow.com/a/39607169/1007353
JDiMatteo

104

আমি আমার সিরিয়ালাইজেশনের জন্য আচারের তুলনায় জেএসএনকে পছন্দ করি। আনপিকলিং ইচ্ছামত কোড চালাতে পারে এবং pickleপ্রোগ্রামগুলির মধ্যে ডেটা স্থানান্তর করতে বা সেশনের মধ্যে ডেটা সঞ্চয় করতে ব্যবহার করা একটি সুরক্ষা গর্ত। জেএসএন কোনও সুরক্ষা গর্ত প্রবর্তন করে না এবং এটি মানক করা হয়, তাই আপনার যদি প্রয়োজন হয় তবে বিভিন্ন ভাষায় প্রোগ্রামগুলি দ্বারা ডেটা অ্যাক্সেস করা যায়।


ধন্যবাদ। যাইহোক আমি একই প্রোগ্রামে ডাম্পিং এবং লোড করব।
জুয়ানজো কন্টি

2
যদিও আপনার বর্তমান অ্যাপ্লিকেশনটিতে সুরক্ষা ঝুঁকি কম হতে পারে, জেএসওএন আপনাকে পুরোপুরি পুরোপুরি বন্ধ করতে দেয়।
মাইক গ্রাহাম

4
কেউ একটি আচার-ভাইরাস তৈরি করতে পারে যা লোড হওয়ার পরে আচারযুক্ত সমস্ত কিছুতে নিজেকে পিক করে। জসন দিয়ে এটি সম্ভব নয়।
ব্যবহারকারী

2
সুরক্ষা ছাড়াও, জেএসএনের অতিরিক্ত সুবিধা রয়েছে যা এটি মাইগ্রেশনকে সহজ করে তোলে, তাই আপনি আপনার অ্যাপ্লিকেশনটির একটি পুরানো সংস্করণ দ্বারা সংরক্ষিত ডেটা লোড করতে পারেন। ইতিমধ্যে আপনি একটি ক্ষেত্র যোগ করতে পারেন, বা একটি সম্পূর্ণ উপ কাঠামো প্রতিস্থাপন করতে পারে। ডিক / তালিকার জন্য এই জাতীয় রূপান্তরকারী (মাইগ্রেশন) লেখার জন্য সরাসরি এগিয়ে রয়েছে, তবে পিকলের সাথে আপনাকে প্রথমে এটি লোড করাতে খুব কঠিন সময় লাগবে, এমনকি আপনি রূপান্তর সম্পর্কে চিন্তাভাবনা করার আগেও।
vog

2
আমি এই দিকটি সম্পর্কে (ভৌগলিক কোড চালানোর জন্য সুরক্ষা এবং আচারযুক্ত বস্তুর জন্য ক্ষমতা) সম্পর্কে ভাবি না। যে ইশারা জন্য ধন্যবাদ!
ক্যাফিনেটেড মাইক

43

কিছু চার্টের সাথে তুলনা করার জন্য আপনি এটি আকর্ষণীয়ও দেখতে পেতে পারেন: http://kovshenin.com/archives/pickle-vs-json- which-is-faster/


1
নিবন্ধটি কেবল স্ট্রিংয়ের সাথে সম্পর্কিত পারফরম্যান্সের সাথে তুলনা করে। আলাদাভাবে
মারিয়ান


20

আপনি যদি প্রাথমিকভাবে গতি এবং স্থান নিয়ে উদ্বিগ্ন হন তবে সিপিকেল ব্যবহার করুন কারণ সিপিকেলটি JSON এর চেয়ে দ্রুত।

যদি আপনি আন্তঃব্যবহারযোগ্যতা, সুরক্ষা এবং / অথবা মানব পাঠযোগ্যতার সাথে আরও বেশি উদ্বিগ্ন হন তবে জেএসএন ব্যবহার করুন।


অন্যান্য উত্তরে বর্ণিত পরীক্ষার ফলাফলগুলি ২০১০ সালে রেকর্ড করা হয়েছিল এবং সিপিকেল প্রোটোকল ২ শো দিয়ে ২০১ 2016 সালে আপডেট হওয়া পরীক্ষাগুলি :

  • সিপিকেল 3.8x দ্রুত লোড হচ্ছে
  • সিপিকেল 1.5x দ্রুত পঠন
  • সিপিকল কিছুটা ছোট এনকোডিং

সঙ্গে এই নিজেকে পুনরুৎপাদন এই সারকথা , যা উপর ভিত্তি করে তৈরি কনস্টানটিন এর বেঞ্চমার্ক অন্যান্য উত্তর রেফারেন্সড কিন্তু প্রোটোকল 2 পরিবর্তে জরান সঙ্গে cPickle ব্যবহার করে, এবং simplejson পরিবর্তে JSON ব্যবহার (যেহেতু JSON simplejson চেয়ে দ্রুত ), যেমন

wget https://gist.github.com/jdimatteo/af317ef24ccf1b3fa91f4399902bb534/raw/03e8dbab11b5605bc572bc117c8ac34cfa959a70/pickle_vs_json.py
python pickle_vs_json.py

একটি মার্চ 2015 সিওন প্রসেসরের অজগর 2.7 সহ ফলাফল:

Dir Entries Method  Time    Length

dump    10  JSON    0.017   1484510
load    10  JSON    0.375   -
dump    10  Pickle  0.011   1428790
load    10  Pickle  0.098   -
dump    20  JSON    0.036   2969020
load    20  JSON    1.498   -
dump    20  Pickle  0.022   2857580
load    20  Pickle  0.394   -
dump    50  JSON    0.079   7422550
load    50  JSON    9.485   -
dump    50  Pickle  0.055   7143950
load    50  Pickle  2.518   -
dump    100 JSON    0.165   14845100
load    100 JSON    37.730  -
dump    100 Pickle  0.107   14287900
load    100 Pickle  9.907   -

আচার প্রোটোকল 3 সহ পাইথন 3.4 আরও দ্রুত is


11

JSON না আচার? কিভাবে JSON এবং আচার সম্পর্কে ! আপনি ব্যবহার করতে পারেন jsonpickle। এটি ব্যবহার করা সহজ এবং ডিস্কে থাকা ফাইলটি পঠনযোগ্য কারণ এটি জেএসএন।

http://jsonpickle.github.com/


2
বিকল্পগুলির বিপরীতে কেউ তার পারফরম্যান্সের বেঞ্চমার্ক করেছে? এখানে যেমন benfrederickson.com/dont-pickle-your-data দেখা যায় কাঁচা জসন হিসাবে এটি পারফরম্যান্সে তুলনীয় ?
জোসেপ ভলস

এটি একটি বিস্তৃত মানদণ্ড নয়, তবে আমার একটি বিদ্যমান খেলা ছিল যেখানে এটি আচার (পাইথন 3) ব্যবহার করে স্তরগুলি সংরক্ষণ করে। আমি মানুষের পঠনযোগ্য দিকের জন্য jsonpickle চেষ্টা করতে চেয়েছিলাম - তবে স্তরটি সংরক্ষণ করা দুঃখজনকভাবে অনেক ধীর ছিল। জসনপিকল এবং 88 মিমি বা স্তর সংরক্ষণের জন্য নিয়মিত আচারের জন্য 1597ms। স্তর লোডের জন্য, জসোনপিকলের জন্য 1604ms এবং আচারের জন্য 388 মানুষের পাঠযোগ্য হিসাবে সংরক্ষণের মতো করুণা।
নীল ম্যাকগিল 16

আমি আমাদের ট্রেডিং সিস্টেমে এটি পরীক্ষা করেছি, আচারের তুলনায় পঠনযোগ্যতা প্রায় 2x সিরিয়ালাইজেশন + ডিসরিয়ালাইজেশন স্পিড পেনাল্টি নিয়ে আসে। অন্য যে কোনও কিছুর জন্য দুর্দান্ত।
নুরেটিন

6

আমি বেশ কয়েকটি পদ্ধতি চেষ্টা করে দেখেছি যে সিপিকল ব্যবহার করে ডাম্প পদ্ধতির প্রোটোকল আর্গুমেন্টটি সেট করে: cPickle.dumps(obj, protocol=cPickle.HIGHEST_PROTOCOL)এটি দ্রুততম ডাম্প পদ্ধতি।

import msgpack
import json
import pickle
import timeit
import cPickle
import numpy as np

num_tests = 10

obj = np.random.normal(0.5, 1, [240, 320, 3])

command = 'pickle.dumps(obj)'
setup = 'from __main__ import pickle, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("pickle:  %f seconds" % result)

command = 'cPickle.dumps(obj)'
setup = 'from __main__ import cPickle, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("cPickle:   %f seconds" % result)


command = 'cPickle.dumps(obj, protocol=cPickle.HIGHEST_PROTOCOL)'
setup = 'from __main__ import cPickle, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("cPickle highest:   %f seconds" % result)

command = 'json.dumps(obj.tolist())'
setup = 'from __main__ import json, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("json:   %f seconds" % result)


command = 'msgpack.packb(obj.tolist())'
setup = 'from __main__ import msgpack, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("msgpack:   %f seconds" % result)

আউটপুট:

pickle         :   0.847938 seconds
cPickle        :   0.810384 seconds
cPickle highest:   0.004283 seconds
json           :   1.769215 seconds
msgpack        :   0.270886 seconds

4

ব্যক্তিগতভাবে, আমি সাধারণত JSON পছন্দ করি কারণ ডেটা মানব-পঠনযোগ্য । অবশ্যই, আপনার যদি আচার ব্যবহারের চেয়ে জাসন গ্রহণ করবেন না এমন কিছু সিরিয়ালাইজ করার দরকার হয়।

তবে বেশিরভাগ ডেটা স্টোরেজের জন্য আপনাকে কোনও অদ্ভুত কিছু সিরিয়ালাইজ করার দরকার নেই এবং জেএসওএন অনেক সহজ এবং সর্বদা আপনাকে এটি কোনও পাঠ্য সম্পাদকের মধ্যে খোলার এবং ডেটা নিজেই পরীক্ষা করে দেখার অনুমতি দেয়।

গতিটি দুর্দান্ত, তবে বেশিরভাগ ডেটাসেটের জন্য পার্থক্য নগণ্য; পাইথন সাধারণত যাইহোক খুব দ্রুত হয় না।



1
সত্য। তবে 100একটি তালিকার উপাদানগুলির জন্য , পার্থক্যটি মানুষের চোখের কাছে সম্পূর্ণ নগণ্য। বৃহত্তর ডেটাসেটের সাথে কাজ করার সময় অবশ্যই আলাদা।
রিকনাগনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.