sorted(list)বনাম মধ্যে পার্থক্য কি list.sort()?
list.sort তালিকায় স্থান পরিবর্তন করে এবং ফেরত দেয় None
sorted যে কোনও পুনরাবৃত্তীয় লাগে এবং সাজানো একটি নতুন তালিকা দেয়।
sorted এই পাইথন বাস্তবায়নের সমতুল্য, তবে সিপিথন বিল্টিন ফাংশনটি সি-তে লিখিতভাবে দ্রুত গতিতে চলতে হবে:
def sorted(iterable, key=None):
new_list = list(iterable) # make a new list
new_list.sort(key=key) # sort it
return new_list # return it
কখন ব্যবহার করবেন?
list.sortআপনি যখন মূল সাজানোর ক্রমটি ধরে রাখতে চান না তখন ব্যবহার করুন (সুতরাং আপনি মেমরির তালিকায় স্থানটি পুনরায় ব্যবহার করতে সক্ষম হবেন)) এবং আপনি যখন তালিকার একমাত্র মালিক হন (যদি তালিকাটি অন্য কোড দ্বারা ভাগ করা হয় এবং আপনি এটিকে পরিবর্তন করুন, আপনি সেই তালিকাটি ব্যবহার করার জন্য বাগগুলি প্রবর্তন করতে পারেন))
sortedআপনি যখন মূল সাজানোর ক্রমটি ধরে রাখতে চান বা যখন আপনি কেবলমাত্র আপনার স্থানীয় কোডের মালিকানাধীন একটি নতুন তালিকা তৈরি করতে চান তখন ব্যবহার করুন ।
List.sort () এর পরে কি কোনও তালিকার আসল অবস্থানগুলি পুনরুদ্ধার করা যায়?
না - যদি না আপনি নিজেই একটি অনুলিপি তৈরি করেন তবে সেই তথ্যটি হারিয়ে যায় কারণ সাজানটি জায়গায় জায়গায় করা হয়েছে।
"এবং কোনটি দ্রুত? আর কত দ্রুত?"
একটি নতুন তালিকা তৈরির শাস্তি চিত্রিত করতে, টাইমিট মডিউলটি ব্যবহার করুন, এখানে আমাদের সেটআপ রয়েছে:
import timeit
setup = """
import random
lists = [list(range(10000)) for _ in range(1000)] # list of lists
for l in lists:
random.shuffle(l) # shuffle each list
shuffled_iter = iter(lists) # wrap as iterator so next() yields one at a time
"""
এবং এলোমেলোভাবে সাজানো 10000 পূর্ণসংখ্যার তালিকার জন্য এখানে আমাদের ফলাফল রয়েছে, যেমনটি আমরা এখানে দেখতে পাচ্ছি, আমরা পুরানো তালিকা তৈরির ব্যয়কথাকে মিথ্যা প্রমাণ করেছি :
পাইথন 2.7
>>> timeit.repeat("next(shuffled_iter).sort()", setup=setup, number = 1000)
[3.75168503401801, 3.7473005310166627, 3.753129180986434]
>>> timeit.repeat("sorted(next(shuffled_iter))", setup=setup, number = 1000)
[3.702025591977872, 3.709248117986135, 3.71071034099441]
পাইথন ঘ
>>> timeit.repeat("next(shuffled_iter).sort()", setup=setup, number = 1000)
[2.797430992126465, 2.796825885772705, 2.7744789123535156]
>>> timeit.repeat("sorted(next(shuffled_iter))", setup=setup, number = 1000)
[2.675589084625244, 2.8019039630889893, 2.849375009536743]
কিছু প্রতিক্রিয়ার পরে, আমি সিদ্ধান্ত নিয়েছি যে আরও একটি পরীক্ষা বিভিন্ন বৈশিষ্ট্য সহ ઇચ્છનીય হবে। এখানে আমি প্রতিটি পুনরাবৃত্তির জন্য 1000 বার দৈর্ঘ্যের একই এলোমেলোভাবে অর্ডার করা তালিকা সরবরাহ করি।
import timeit
setup = """
import random
random.seed(0)
lst = list(range(100000))
random.shuffle(lst)
"""
আমি মার্টিজন দ্বারা উল্লিখিত অনুলিপি থেকে আসা এই বৃহত্তর ধরণের পার্থক্যের ব্যাখ্যা করছি, তবে এটি এখানে প্রাচীনতম জনপ্রিয় উত্তরে বর্ণিত বিন্দুটির উপর প্রাধান্য পাবে না, এখানে সময়ের বৃদ্ধি কেবল প্রায় 10%
>>> timeit.repeat("lst[:].sort()", setup=setup, number = 10000)
[572.919036605, 573.1384446719999, 568.5923951]
>>> timeit.repeat("sorted(lst[:])", setup=setup, number = 10000)
[647.0584738299999, 653.4040515829997, 657.9457361929999]
আমি উপরেরটিও আরও অনেক ছোট বাছাই করে চালিয়েছি এবং দেখেছি যে নতুন sortedঅনুলিপি সংস্করণটি এখনও 1000 দৈর্ঘ্যের এক ধরণের উপরে প্রায় 2% দীর্ঘ সময় চালায়।
পোকে নিজের কোডটিও চালিয়েছিলেন, এখানে কোডটি রয়েছে:
setup = '''
import random
random.seed(12122353453462456)
lst = list(range({length}))
random.shuffle(lst)
lists = [lst[:] for _ in range({repeats})]
it = iter(lists)
'''
t1 = 'l = next(it); l.sort()'
t2 = 'l = next(it); sorted(l)'
length = 10 ** 7
repeats = 10 ** 2
print(length, repeats)
for t in t1, t2:
print(t)
print(timeit(t, setup=setup.format(length=length, repeats=repeats), number=repeats))
তিনি 1000000 দৈর্ঘ্যের ধরণের জন্য খুঁজে পেয়েছিলেন, (100 বার দৌড়েছিলেন) একই রকম ফলাফল, তবে সময়ের প্রায় 5% বৃদ্ধি, এখানে ফলাফল:
10000000 100
l = next(it); l.sort()
610.5015971539542
l = next(it); sorted(l)
646.7786222379655
উপসংহার:
sortedএকটি অনুলিপি তৈরি করার সাথে একটি বৃহত আকারের তালিকাটি বাছাই করা সম্ভবত পার্থক্যগুলিকে প্রভাবিত করবে, তবে বাছাই করা নিজেই অপারেশনে আধিপত্য বজায় রাখবে এবং এই কোডগুলির মধ্যে আপনার কোডকে সংগঠিত করা অকাল অপ্টিমাইজেশন হতে পারে। আমার sortedযখন ডেটাগুলির একটি নতুন বাছাই করা তালিকা list.sortদরকার তখন আমি ব্যবহার করব এবং যখন আমার জায়গাটিতে কোনও তালিকা বাছাই করা দরকার তখন আমি ব্যবহার করব এবং এটি আমার ব্যবহার নির্ধারণ করুক।
sorted()স্ট্রিং আর্গুমেন্টে কল করলেও মনে হয় এটি তালিকা বলে মনে হয়, আপনি একটি স্ট্রিং নয়, একটি তালিকার ফলাফল পেয়েছেন :sorted("abcd", reverse=True)দেয়['d', 'c', 'b', 'a']না"dcba"