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
जब आप मूल सॉर्ट क्रम बनाए रखना चाहते हैं या जब आप एक नई सूची है कि केवल अपने स्थानीय कोड का मालिक बनाने के लिए कामना करता हूं।
क्या सूची के बाद एक सूची के मूल पदों को पुनः प्राप्त किया जा सकता है?
नहीं - जब तक आप स्वयं एक प्रति नहीं बनाते, तब तक वह जानकारी खो जाती है क्योंकि इस तरह का काम किया जाता है।
"और जो तेज है? और कितना तेज है?"
नई सूची बनाने के लिए दंड का वर्णन करने के लिए, समय-सीमा मॉड्यूल का उपयोग करें, यहां हमारा सेटअप है:
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]
कुछ प्रतिक्रिया के बाद, मैंने फैसला किया कि एक और परीक्षा विभिन्न विशेषताओं के साथ वांछनीय होगी। यहाँ मैं एक ही बेतरतीब ढंग से आदेशित सूची की लंबाई में प्रत्येक पुनरावृत्ति के लिए 1,000 बार प्रदान करता हूं।
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"