পাইথন ৩.6++-তে অভিধানের অর্ডার দেওয়া আছে?
তারা সন্নিবেশ আদেশ করা হয় [1] । পাইথন 3.6 এর হিসাবে, পাইথন এর CPython বাস্তবায়নের, অভিধান সন্নিবেশিত আইটেম অর্ডার স্মরণ । এটি পাইথন ৩.6 এ প্রয়োগের বিশদ হিসাবে বিবেচিত হয় ; পাইথনের অন্যান্য বাস্তবায়ন (এবং অন্যান্য আদেশযুক্ত আচরণ [1] ) জুড়ে গ্যারান্টযুক্তOrderedDict সন্নিবেশ ক্রম চাইলে আপনাকে ব্যবহার করতে হবে ।
পাইথন ৩.7 অনুসারে , এটি আর বাস্তবায়নের বিশদ নয় এবং পরিবর্তে এটি ভাষা বৈশিষ্ট্যে পরিণত হয়। জিভিআরের একটি অজগর-দেব বার্তা থেকে :
তেমনই করে ফেলো. "ডিক্ট সন্নিবেশের আদেশ রাখে" এই রায়। ধন্যবাদ!
এর সহজ অর্থ হ'ল আপনি এটির উপর নির্ভর করতে পারেন । পাইথনের অন্যান্য বাস্তবায়নগুলিতে অবশ্যই পাইথন ৩.7 এর যথাযথ বাস্তবায়ন হতে চাইলে অবশ্যই একটি সন্নিবেশ আদেশ আদেশ দেওয়া উচিত।
উপাদান অর্ডার সংরক্ষণের সময় পাইথন 3.6অভিধান প্রয়োগকরণ কীভাবে পুরানোটির চেয়ে ভাল [2] সম্পাদন করতে পারে?
মূলত, দুটি অ্যারে রেখে ।
প্রথম অ্যারে, অভিধানের জন্য dk_entriesএন্ট্রি ( টাইপPyDictKeyEntry ) ধারণ করে যাতে তারা inোকানো হয়েছিল। সংরক্ষণের অর্ডারটি কেবলমাত্র একটি সংযোজন অ্যারে হয়েই পাওয়া যায় যেখানে সর্বদা নতুন আইটেমগুলি সন্নিবেশ করা হয় (সন্নিবেশ ক্রম)।
দ্বিতীয়টি, অ্যারের dk_indicesসূচকগুলি ধরে রাখে dk_entries(এটি হল মানগুলি যা সংশ্লিষ্ট প্রবেশের অবস্থান নির্দেশ করে dk_entries)। এই অ্যারে হ্যাশ টেবিল হিসাবে কাজ করে। একটি কী হ্যাশ করা হয় এটি সঞ্চিত সূচকগুলির একটির দিকে নিয়ে যায় এবং আনুষাঙ্গিক dk_indicesঅনুসারে সংশ্লিষ্ট এন্ট্রিটি আনা হয় dk_entries। যেহেতু কেবল সূচকগুলি রাখা হয়, তাই এই অ্যারের ধরণটি অভিধানের সামগ্রিক আকারের উপর নির্ভর করে (টাইপ int8_t( 1বাইট) থেকে int32_t/ int64_t( 4/ 8বাইট) 32/ 64বিট বিল্ডস পর্যন্ত)
পূর্ববর্তী বাস্তবায়নে, প্রকার PyDictKeyEntryও আকারের একটি বিচ্ছিন্ন অ্যারে dk_sizeবরাদ্দ করতে হয়েছিল; দুর্ভাগ্যবশত, এটি খালি স্থান অনেক ফলে যেহেতু যে অ্যারের বেশী হতে দেওয়ার অনুমতি দেওয়া হয়নি 2/3 * dk_sizeপূর্ণ কর্মক্ষমতা কারণে । (এবং খালি জায়গার এখনওPyDictKeyEntry আকার ছিল !)।
এটি এখনকার ক্ষেত্রে নয় কারণ কেবলমাত্র প্রয়োজনীয় এন্ট্রিগুলি সঞ্চিত রয়েছে (সেগুলি সন্নিবেশ করা হয়েছে) এবং প্রকারের একটি স্পারস অ্যারে intX_t( Xডিক আকারের উপর নির্ভর করে) 2/3 * dk_sizeপূর্ণ রাখে। খালি জায়গাটি টাইপ থেকে পরিবর্তিত PyDictKeyEntryহয়েছে intX_t।
সুতরাং, স্পষ্টতই, একটি বিচ্ছিন্ন অ্যারে তৈরি করা ধরণের PyDictKeyEntryস্টোরের জন্য একটি বিচ্ছিন্ন অ্যারের চেয়ে অনেক বেশি মেমরির দাবি int।
আগ্রহী যদি এই বৈশিষ্ট্যটি সম্পর্কিত আপনি পাইথন-ডেভের সম্পূর্ণ কথোপকথনটি দেখতে পারেন তবে এটি ভাল পড়া is
রেমন্ড হেট্টিংগার দ্বারা নির্মিত মূল প্রস্তাবনায় , ব্যবহৃত ডেটা স্ট্রাকচারের একটি ভিজ্যুয়ালাইজেশন দেখা যায় যা ধারণাটির সূত্র ধরে capt
উদাহরণস্বরূপ, অভিধান:
d = {'timmy': 'red', 'barry': 'green', 'guido': 'blue'}
বর্তমানে [কীহ্যাশ, কী, মান] হিসাবে সংরক্ষণ করা হয়েছে:
entries = [['--', '--', '--'],
[-8522787127447073495, 'barry', 'green'],
['--', '--', '--'],
['--', '--', '--'],
['--', '--', '--'],
[-9092791511155847987, 'timmy', 'red'],
['--', '--', '--'],
[-6480567542315338377, 'guido', 'blue']]
পরিবর্তে, ডেটা নিম্নলিখিত হিসাবে সংগঠিত করা উচিত:
indices = [None, 1, None, None, None, 0, None, 2]
entries = [[-9092791511155847987, 'timmy', 'red'],
[-8522787127447073495, 'barry', 'green'],
[-6480567542315338377, 'guido', 'blue']]
আপনি এখন দৃশ্যমান হিসাবে দেখতে পাচ্ছেন, মূল প্রস্তাবনায়, সংঘর্ষ হ্রাস করতে এবং চেহারা দ্রুত তৈরি করার জন্য প্রচুর জায়গা মূলত খালি। নতুন পদ্ধতির সাহায্যে, সূচকগুলিতে, যেখানে সত্যই এটি প্রয়োজন সেখানে স্নেহ সরিয়ে আপনি প্রয়োজনীয় স্মৃতি হ্রাস করেন।
[1]: আমি বলি "সন্নিবেশের আদেশ" এবং অর্ডারডিক্টের অস্তিত্বের সাথে "অর্ডার করা" নয়, "অর্ডার করা" আরও এমন আচরণের পরামর্শ দেয় যা dictঅবজেক্টটি সরবরাহ করে না । অর্ডারডিক্টসগুলি বিপরীতমুখী হয়, অর্ডার সংবেদনশীল পদ্ধতি সরবরাহ করে এবং মূলত অর্ডার-সংবেদনশীল সমতা পরীক্ষা দেয় ( ==, !=)। dictএর বর্তমানে সেই আচরণ / পদ্ধতিগুলির কোনও অফার করে না।
[২]: নতুন অভিধান প্রয়োগগুলি আরও নিখুঁতভাবে নকশাকৃত করে মেমরি অনুসারে আরও ভাল সম্পাদন করে ; এটাই এখানে মূল উপকার। গতি অনুসারে, তফাতটি এতটা কঠোর নয়, এমন জায়গাগুলি রয়েছে যেখানে নতুন ডিকটি সামান্য রিগ্রেশন ( উদাহরণস্বরূপ কী ) দেখাতে পারে অন্যদিকে (পুনরাবৃত্তি এবং পুনরায় আকার দেওয়ার বিষয়টি মাথায় আসে) একটি পারফরম্যান্স বুস্ট উপস্থিত থাকতে হবে।
সামগ্রিকভাবে, অভিধানের পারফরম্যান্স, বিশেষত বাস্তব জীবনের পরিস্থিতিতে, সংক্ষিপ্ততার পরিচয় হওয়ার কারণে উন্নতি হয়।