পাইথন সন্নিবেশ ক্রম সংরক্ষণ করে না কেন?


12

আমি সম্প্রতি আবিষ্কার করে অবাক হয়েছি যে পাইথন ৩.7++-তে ডিক্টস সন্নিবেশ ক্রম সংরক্ষণের গ্যারান্টিযুক্ত, সেটগুলি নেই:

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> d
{'a': 1, 'b': 2, 'c': 3}
>>> d['d'] = 4
>>> d
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> s = {'a', 'b', 'c'}
>>> s
{'b', 'a', 'c'}
>>> s.add('d')
>>> s
{'d', 'b', 'a', 'c'}

এই পার্থক্যের যৌক্তিকতা কী? পাইথন টিমের একই দক্ষতার উন্নতিগুলি যা ডিকটি বাস্তবায়নে পরিবর্তন আনতে পরিচালিত হয়েছিল সেটিও সেটগুলিতে প্রযোজ্য নয়?

আমি অর্ডার করা-সেট বাস্তবায়ন বা সেট জন্য স্ট্যান্ড-ইন হিসাবে dicts ব্যবহার করার উপায় নির্দেশক খুঁজছি না। আমি কেবল ভাবছি যে পাইথন টিম একই সাথে বিল্ট-ইন সেটগুলি অর্ডার সংরক্ষণের ব্যবস্থা করে নি কেন তারা ডিক্টসের জন্য এটি করেছিল।


1
এটা কি তোমার প্রশ্নের উত্তর? পাইথনের কি অর্ডার করা সেট আছে?
মিহাই চেলারু

1
না, আমি বুঝতে পারি যে পাইথনের কোনও অর্ডার করা সেট নেই। আমি কেবল ভাবছি কেন এটি কেন, কারণ এখন ডিক্টস অর্ডার করা হয়েছে।
বার্ট রবিনসন

4
ব্যবহারের ধরণগুলি পৃথক, তাই তারা বিভিন্ন ব্যবহারের ক্ষেত্রে অনুকূলিত। এটি একটি সাধারণ ভ্রান্ত ধারণা যা সেটগুলি সিপিথনের নাল মানগুলির সাথে কেবল ফাঁকা থাকে, এটি সম্পূর্ণ ভুল: বাস্তবায়নগুলি পৃথক। যদি আপনার প্রশ্নটি বন্ধ না হয়, তবে আমি একটি বিশদ উত্তর পোস্ট করতে পারি।
Wim

1
"ব্যবহারের ধরণগুলি আলাদা, তাই তারা বিভিন্ন ব্যবহারের ক্ষেত্রে অনুকূলিত হয়" " আমি মনে করি প্রশ্নের উত্তরের একটি উত্তর এটি বিশদভাবে প্রকাশ করবে। সম্পর্কিত ব্যবহারের ক্ষেত্রে দুটি পৃথক পদ্ধতির অনুকূলকরণ কী করে সে সম্পর্কে প্রশ্ন।
কার্ল নচেটেল

নোট করুন যে পাইপই উভয় ক্ষেত্রে dictএবং একই সাথে set2.7 থেকে একই ক্রম ব্যবহার করে ।
মিস্টারমিয়াগি

উত্তর:


10

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

উভয় ডেটা স্ট্রাকচার হ্যাশ ভিত্তিক হলেও এটি একটি সাধারণ ভুল ধারণা যা সেটগুলি কেবল নাল মান সহ ডিক্ট হিসাবে প্রয়োগ করা হয়। এমনকি সামনে CPython 3.6 কম্প্যাক্ট অভি প্রয়োগ, সেট এবং অভি বাস্তবায়নের ইতিমধ্যে সামান্য কোড পুনঃব্যবহারের সঙ্গে উল্লেখযোগ্যভাবে ভিন্ন। উদাহরণস্বরূপ, ডিক্টগুলি এলোমেলোভাবে প্রোবিং ব্যবহার করে তবে সেটগুলি ক্যাশের লোকাল উন্নত করতে লিনিয়ার প্রোবিং এবং ওপেন অ্যাড্রেসিংয়ের সংমিশ্রণ ব্যবহার করে। প্রাথমিক লিনিয়ার প্রোব ( সিপাইটিতে ডিফল্ট 9 পদক্ষেপ ) হ্যাশ সংঘর্ষের হ্যান্ডলিংয়ের ব্যয় হ্রাস করে পারফরম্যান্স উন্নত করে সংযুক্ত কী / হ্যাশ জোড়াগুলির একটি সিরিজ পরীক্ষা করবে - ক্রমাগত মেমরি অ্যাক্সেস ছড়িয়ে ছিটিয়ে থাকা প্রোবের চেয়ে সস্তা।

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

সেটগুলি আনর্ডর্ডেড থাকে। (কেন? ব্যবহারের ধরণগুলি আলাদা Also এছাড়াও, বিভিন্ন বাস্তবায়ন।)

- গাইডো ভ্যান রসম

সেটগুলি একটি পৃথক অ্যালগরিদম ব্যবহার করে যা সন্নিবেশ ক্রম ধরে রাখার মতো তত সংশোধনযোগ্য নয়। অর্ডার প্রয়োজনে সেট-টু-সেট অপারেশনগুলি তাদের নমনীয়তা এবং অপ্টিমাইজেশানগুলি হারাবে। সেট গণিতটি আনর্ডারড সেটগুলির ক্ষেত্রে সংজ্ঞায়িত করা হয়। সংক্ষেপে, সেট অর্ডারিং তাৎক্ষণিক ভবিষ্যতে নয় isn't

- রেমন্ড হেট্টিংগার

৩.7-এর জন্য সেটগুলি সংহত করতে হবে কিনা তার একটি বিশদ আলোচনা এবং কেন এর বিরুদ্ধে সিদ্ধান্ত নেওয়া হয়েছিল সে সম্পর্কে উত্তর পাইথন-ডেভ মেইলিং তালিকায় পাওয়া যাবে।

সংক্ষেপে, প্রধান বিষয়গুলি হ'ল ব্যবহারের ধরণগুলি পৃথক (সন্নিবেশ ক্রম ডিক্ট যেমন ** কোয়ার্গস দরকারী , সেটের জন্য কম), কমপ্যাক্ট সেটগুলির জন্য স্থান সঞ্চয় কম তাৎপর্যপূর্ণ (কারণ এখানে কেবল কী এবং হ্যাশ অ্যারে রয়েছে) ঘনক্ষেত্র, কীগুলি, হ্যাশগুলি এবং মানগুলির বিপরীতে) এবং সেটগুলিতে পূর্বোক্ত রৈখিক অনুসন্ধানের অপ্টিমাইজেশানটি একটি কমপ্যাক্ট প্রয়োগের সাথে বেমানান।

আমি নীচে রেমন্ডের পোস্টটি পুনরুত্পাদন করব যা সবচেয়ে গুরুত্বপূর্ণ পয়েন্টগুলিকে coversেকে রাখে।

14 ই সেপ্টেম্বর, 2016, বিকাল 3:50 এ, এরিক স্নো লিখেছেন:

তারপরে, আমি সেটগুলিতেও তাই করব।

আমি ভুল বুঝে না নিলে রেমন্ড সেটে একই রকম পরিবর্তন আনার বিরোধিতা করেছিল।

সেটা ঠিক. লোকেরা বুনো চালানো শুরু করার আগে এখানে এই বিষয়ে কয়েকটি চিন্তাভাবনা দেওয়া হল।

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

  • সেটগুলির ব্যবহারের প্যাটার্নটি ডিক্ট থেকে আলাদা is প্রাক্তনটির আরও হিট বা মিস লুক রয়েছে। পরবর্তীটির কী কী লুকআপ কম রয়েছে। এছাড়াও, সেট-টু-সেট ক্রিয়াকলাপগুলির জন্য কয়েকটি অপ্টিমাইজেশন পারফরম্যান্সকে প্রভাবিত না করে সেট ক্রম বজায় রাখা কঠিন করে তোলে।

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

  • আপাতত, অভিধানগুলিতে অর্ডারের পার্শ্ব-প্রতিক্রিয়াটি গ্যারান্টিযুক্ত নয়, সুতরাং সেটগুলিও আদেশ হয়ে ওঠার জন্য জোর দেওয়া শুরু করা অকাল। দস্তাবেজগুলি ইতিমধ্যে একটি অর্ডারসেট ( https://code.activestate.com/recips/576694/ ) তৈরির একটি রেসিপিটির সাথে লিঙ্ক করেছে তবে দেখে মনে হচ্ছে আপটিকটি প্রায় শূন্য হয়েছে। এছাড়াও, এখন যে এরিক স্নো আমাদের একটি দ্রুত অর্ডারডিক্ট দিয়েছে তাই মিউটেবলসেট এবং অর্ডারডিক্ট থেকে অর্ডারসেট তৈরি করা আগের চেয়ে সহজ, তবে আমি আবার কোনও সত্য আগ্রহ দেখিনি কারণ আদর্শ সেট-টু-সেট ডেটা অ্যানালিটিকাগুলি সত্যিই দেয় না অর্ডার সম্পর্কে প্রয়োজন বা যত্ন। তেমনি, দ্রুত সদস্যতার পরীক্ষার প্রাথমিক ব্যবহার হ'ল অর্জানস্টিক।

  • এটি বলেছিল, আমি মনে করি পিআইপিআইতে বিকল্প সেট বাস্তবায়ন যুক্ত করার মতো জায়গা আছে। বিশেষত, অগ্নিপরীক্ষাযোগ্য ডেটার জন্য কিছু আকর্ষণীয় বিশেষ কেস রয়েছে যেখানে সেট-টু-সেট ক্রিয়াকলাপগুলি কীগুলির সম্পূর্ণ ব্যাপ্তিগুলির সাথে তুলনা করে বাড়ানো যায় (দেখুন https://code.activestate.com/recips/230113- বাস্তবায়ন-of- একটি প্রারম্ভিক পয়েন্টের জন্য ব্যবহার করে সাজানো-তালিকা সেট করে )। আইআইআরসি, পাইপিআই এর মধ্যে ইতিমধ্যে সেট-মতো ব্লুম ফিল্টার এবং কোকিল হ্যাশিংয়ের কোড রয়েছে।

  • আমি বুঝতে পেরেছি যে পাইথন কোরটিতে কোডের একটি বড় ব্লক গ্রহণ করা উত্তেজনাকর তবে এটি প্ল্যান্ট হওয়া নিশ্চিত না হওয়া অবধি অন্য ডেটাটাইপগুলির আরও বড় পুনর্লিখনগুলিতে জড়িত হওয়ার জন্য প্লাবনগঠনের জন্য এটি না খোলার উচিত।

- রেমন্ড হেট্টিংগার

থেকে [পাইথন-dev] পাইথন 3.6 অভি কম্প্যাক্ট হয়ে যায় এবং একটি প্রাইভেট সংস্করণটি; এবং কীওয়ার্ডগুলি অর্ডার হয়ে যায় , সেপ্টেম্বর 2016।


2

আলোচনা

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

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


পার্সপেকটিভস

পাইথনে সেটগুলির নিরক্ষিত প্রকৃতি গাণিতিক সেটগুলির আচরণের সাথে সমান্তরাল । অর্ডার গ্যারান্টিযুক্ত হয় না।

সম্পর্কিত গাণিতিক ধারণাটি সীমানাবিহীন এবং আদেশ চাপানো যেমন অদ্ভুত হবে - আর। হেট্টিংগার

যদি কোনো ধরনের অর্ডার পাইথন মধ্যে সেট চালু হয়, তাহলে এই আচরণ একটি সম্পূর্ণ পৃথক গাণিতিক গঠন, যথা একটি আদেশ সেট (অথবা Oset) মেনে চলতে হবে। ওসেটগুলি গণিতে বিশেষত সংমিশ্রনে একটি পৃথক রোল বাজায়। ঘণ্টা পরিবর্তনের ক্ষেত্রে ওয়েটসের একটি ব্যবহারিক প্রয়োগ লক্ষ্য করা যায় ।

আনর্ডারড সেট থাকা খুব জেনেরিক এবং সর্বব্যাপী ডেটা স্ট্রাকচারের সাথে সামঞ্জস্যপূর্ণ যা বেশিরভাগ আধুনিক গণিত, অর্থাৎ সেট থিওরিটিকে আনপিন করে । আমি জমা দিচ্ছি, পাইথনে আনর্ডারড সেটগুলি রাখা ভাল।

এই বিষয়ে প্রসারিত সম্পর্কিত পোস্টগুলি দেখুন:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.