বাছাইয়ের চেয়ে সর্বোচ্চ ধীর কেন?


92

আমি পাইথন 2 এবং 3 maxএর sortফাংশনটির চেয়ে ধীর গতিতে পেয়েছি ।

পাইথন 2

$ python -m timeit -s 'import random;a=range(10000);random.shuffle(a)' 'a.sort();a[-1]'
1000 loops, best of 3: 239 usec per loop
$ python -m timeit -s 'import random;a=range(10000);random.shuffle(a)' 'max(a)'        
1000 loops, best of 3: 342 usec per loop

পাইথন ঘ

$ python3 -m timeit -s 'import random;a=list(range(10000));random.shuffle(a)' 'a.sort();a[-1]'
1000 loops, best of 3: 252 usec per loop
$ python3 -m timeit -s 'import random;a=list(range(10000));random.shuffle(a)' 'max(a)'
1000 loops, best of 3: 371 usec per loop

কেন হয় max ( O(n)) তুলনায় ধীর sortফাংশন ( O(nlogn))?


4
আপনি একবার পাইথন 2 বিশ্লেষণ চালিয়েছিলেন এবং পাইথন 3 কোডটি হুবহু একই।
এরিপ

9
a.sort()জায়গায় কাজ করে। চেষ্টা করুনsorted(a)
আন্দ্রে কার্বেলিনী

আপনি যদি এটি স্থির করে থাকেন তবে এটি ঠিক করার জন্য আপনি যা করেছেন তা পোস্ট করুন, দয়া করে।
প্রিটজেল

4
@ প্রিটজেল ওপি মানে পোস্টটি সম্পাদনা করা হয়েছে, সমস্যাটি স্থির করে দেওয়া হয়নি।
এরিপ

4
@ ওয়েজহংটু কিন্তু সাজানো sort, এবং তারপরে aচিরকালের জন্য বাছাই করা হয়েছে
njzk2

উত্তর:


125

timeitপাইথনের মডিউলটি ব্যবহার করার সময় আপনাকে খুব সতর্কতা অবলম্বন করতে হবে ।

python -m timeit -s 'import random;a=range(10000);random.shuffle(a)' 'a.sort();a[-1]'

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

পাইথনের বাছাই করা অ্যালগরিদমের অংশ হ'ল অ্যারেটি ইতিমধ্যে আংশিক বা সম্পূর্ণ বাছাই করা হয়েছে তা সনাক্ত করা। সম্পূর্ণরূপে বাছাই করার পরে এটি সনাক্ত করতে কেবল অ্যারের মাধ্যমে একবার স্ক্যান করতে হবে এবং তারপরে এটি বন্ধ হয়ে যায়।

পরিবর্তে যদি আপনি চেষ্টা করেছেন:

python -m timeit -s 'import random;a=range(100000);random.shuffle(a)' 'sorted(a)[-1]'

তারপরে বাছাই প্রতিটি টাইমিং লুপে ঘটে এবং আপনি দেখতে পাচ্ছেন যে অ্যারে বাছাই করার সময়টি সর্বাধিক মান সন্ধান করার চেয়ে অনেক বেশি দীর্ঘ।

সম্পাদনা: @ স্কাইনিংয়ের উত্তরটি আমি যে অংশটি অব্যক্ত রেখেছি a.sort()তা ব্যাখ্যা করে: জানেন যে এটি একটি তালিকায় কাজ করছে যাতে উপাদানগুলিতে সরাসরি অ্যাক্সেস করতে পারে। max(a)যেকোন যথেচ্ছ পুনরাবৃত্তিতে কাজ করে তাই জেনেরিক পুনরাবৃত্তি ব্যবহার করতে হয়।


10
ভালো বল ধরা. আমি কখনই বুঝতে পারি নি যে কোড রান জুড়ে দোভাষী রাষ্ট্রটি ধরে রাখা যায়। এখন আমি অবাক হয়েছি যে অতীতে আমি কতটি ত্রুটিযুক্ত মানদণ্ড তৈরি করেছি। : -}
ফ্রিরিচ রাবাব

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

4
পছন্দ করুন আমি মনে করি @ সাইকিং উত্তরটির অর্ধেক উত্তর পেয়েছে: a.sort()জানেন যে এটি একটি তালিকায় কাজ করছে যাতে সরাসরি উপাদানগুলিতে অ্যাক্সেস করতে পারে। max(a)জেনেরিক পুনরাবৃত্তির ব্যবহার করতে একটি স্বেচ্ছাসেবী ক্রমতে কাজ করে।
ডানকান

4
@KarolyHorvath হয়তো শাখা ভবিষ্যদ্বাণী কেন বারবার একটি সাজানো অ্যারের বাছাই ব্যাখ্যা করতে পারেন দ্রুততর: stackoverflow.com/a/11227902/4600
marcospereira

4
@ জুনিয়রকম্প্রেসার listsort.txtব্যাখ্যা করেছেন "এটি বিভিন্ন ধরণের আংশিক অর্ডার করা অ্যারেগুলিতে (এলজি (এন!) এর তুলনায় কম, এবং এন -১ এর তুলনায় কম) এর উপর অতিপ্রাকৃত কর্মক্ষমতা রয়েছে" এবং তারপরে সমস্ত ধরণের গোরু অপ্টিমাইজেশনের ব্যাখ্যা করতে চলেছে। আমি মনে করি এটি প্রচুর অনুমান করতে পারে যা maxপারে না, অর্থাৎ বাছাই করা তাত্পর্যপূর্ণভাবে দ্রুত হয় না।
ফ্রিরিচ রাবাব

86

প্রথমে, দ্রষ্টব্য যে পুনরায় max()প্রোটোকল ব্যবহার করে , যখন list.sort()অ্যাড-হক কোড ব্যবহার করে । স্পষ্টতই, একটি পুনরায় ব্যবহারকারীর ব্যবহার একটি গুরুত্বপূর্ণ ওভারহেড, এজন্য আপনি সময়গুলির মধ্যে এই পার্থক্যটি পর্যবেক্ষণ করছেন।

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

এগুলি সুষ্ঠু পরীক্ষা:

$ python3 -m timeit -s 'import random;a=list(range(10000));random.shuffle(a)' 'max(a[:])'
1000 loops, best of 3: 227 usec per loop
$ python3 -m timeit -s 'import random;a=list(range(10000));random.shuffle(a)' 'a[:].sort()'
100 loops, best of 3: 2.28 msec per loop

এখানে আমি প্রতিবার তালিকার একটি অনুলিপি তৈরি করছি। যেমন আপনি দেখতে পাচ্ছেন, ফলাফলের পরিমাণের ক্রমটি পৃথক: মাইক্রো- বনাম মিলিসেকেন্ড, আমরা যেমন আশা করব।

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


31

এটি হতে পারে কারণ l.sortএকজন সদস্য listযখন maxএকটি জেনেরিক ফাংশন হয়। এর অর্থ এই যে l.sortএর অভ্যন্তরীণ উপস্থাপনার উপর নির্ভর করতে পারে listযখন maxজেনেরিক পুনরায় প্রোটোকলের মধ্য দিয়ে যেতে হবে।

এটি তৈরি করে যে প্রতিটি উপাদান আনার প্রতিটি উপাদান আনার l.sortচেয়ে দ্রুত maxহয়।

আমি ধরে নিয়েছি যে আপনি যদি এর পরিবর্তে ব্যবহার করেন sorted(a)তবে ফলাফলটি আপনার চেয়ে ধীর পাবেন max(a)


4
এই ধারনাটি আরও কংক্রিট হওয়ার জন্য কেবলমাত্র এক-লাইনারের সময়। আপনার জ্ঞান নিয়ে প্রশ্ন তোলা হচ্ছে না, এই জাতীয় সংজ্ঞা যারা জানেন না তাদের প্রদর্শনের জন্য এটি নগণ্য।
অবধি 43

আপনি যে সঠিক sorted(a)চেয়ে ধীর max(a)। আশ্চর্যের বিষয় নয় যে এটি প্রায় একই গতি সম্পর্কে a.sort(), তবে আপনার অনুমানের কারণটি কী নয় because এটি কারণ ওপি গ্রহণযোগ্য উত্তরের নির্দেশিত হিসাবে তাদের পরীক্ষায় ভুল করেছিল।
মার্টিনিউ

মুল বক্তব্যটি হ'ল জেনেরিক ইটারেটর প্রোটোকলে log(n)জটিলতার ফ্যাক্টরটি অফসেট করার জন্য পর্যাপ্ত ওভারহেড থাকার সম্ভাবনা রয়েছে । এটি একটি O(n)অ্যালগরিদম কেবলমাত্র O(nlogn)যথেষ্ট বড় জন্য একটি অ্যালগরিদমের চেয়ে দ্রুত গ্যারান্টিযুক্ত n(উদাহরণস্বরূপ কারণ প্রতিটি ক্রিয়াকলাপের সময় অ্যালগরিদমের মধ্যে পৃথক nlognহতে পারে - দ্রুত পদক্ষেপগুলি nধীর পদক্ষেপের চেয়ে দ্রুততর হতে পারে )। ঠিক যেখানে বিরতি এমনকি বিবেচনা করা হয় না এই ক্ষেত্রে (তবে একটি সচেতন হওয়া উচিত যে log nফ্যাক্টর ছোটদের জন্য খুব বড় ফ্যাক্টর নয় n)।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.