sorted(list)
Vs arasındaki fark nedir list.sort()
?
list.sort
listeyi yerinde değiştirir ve geri döner None
sorted
herhangi bir yinelenebilir alır ve sıralanmış yeni bir liste döndürür.
sorted
bu Python uygulamasına eşdeğerdir, ancak CPython yerleşik işlevi C'de yazıldığından ölçülebilir şekilde daha hızlı çalışmalıdır:
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
ne zaman kullanılır?
- kullanım
list.sort
orijinal sıralama düzenini korumak istemeyen zaman (Böylece. Bellekte yerinde listeyi yeniden mümkün olacak) ve (listedeki tek sahibi olduklarında liste diğer kod ve sizin tarafınızdan paylaşılıyorsa mutasyona uğrarsanız, bu listenin kullanıldığı hataları tanıtabilirsiniz.)
- Kullan
sorted
orijinal sıralama düzenini korumak isteyen veya sadece yerel kod sahibi olduğu yeni bir liste oluşturmak istediğinizde.
Listenin orijinal konumları list.sort () öğesinden sonra alınabilir mi?
Hayır - kendiniz bir kopyasını yapmadıysanız, sıralama yerinde yapıldığından bu bilgiler kaybolur.
"Ve hangisi daha hızlı? Ve ne kadar daha hızlı?"
Yeni bir liste oluşturmanın cezasını göstermek için timeit modülünü kullanın, işte kurulumumuz:
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
"""
Ve burada gördüğümüz gibi rastgele düzenlenmiş 10000 tamsayı listesi için sonuçlarımız, daha eski bir liste oluşturma masrafı mitini çürütdük :
Python 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]
Python 3
>>> 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]
Bazı geri bildirimlerden sonra, farklı özelliklere sahip başka bir testin isteneceğine karar verdim. Burada, her yineleme için 1000 kez aynı rastgele sıralı 100.000 uzunluk listesini sağlarım.
import timeit
setup = """
import random
random.seed(0)
lst = list(range(100000))
random.shuffle(lst)
"""
Bu daha büyük türün Martijn tarafından belirtilen kopyadan gelen farkını yorumluyorum, ancak burada daha eski daha popüler cevapta belirtilen noktaya hakim değil, burada zaman artışı sadece yaklaşık% 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]
Yukarıdakileri de çok daha küçük bir çeşitte çalıştırdım ve yeni sorted
kopya versiyonunun 1000 çeşit bir çalışma süresinde hala% 2 daha uzun sürdüğünü gördüm .
Poke kendi kodunu da çalıştırdı, işte kod:
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 uzunluk sıralaması buldu, (100 kez koştu) benzer bir sonuç, ama zamanın sadece% 5'inde bir artış, çıktı:
10000000 100
l = next(it); l.sort()
610.5015971539542
l = next(it); sorted(l)
646.7786222379655
Sonuç:
Bir sorted
kopya oluşturma ile sıralanan büyük boyutlu bir liste büyük olasılıkla farklılıklara hükmeder, ancak sıralamanın kendisi işleme hakim olur ve kodunuzu bu farklılıklar etrafında düzenlemek erken optimizasyon olacaktır. Ben kullanırım sorted
ben yeni bir veri sıralı liste gerektiğinde, ben kullanmak list.sort
ben yerinde bir liste sıralamak gerektiğinde ve bu benim kullanımını belirlemek edelim.
sorted()
bir dize argümanını (yanlışlıkla) çağırırsanız dikkat edin ama bunun bir liste olduğunu düşünüyorsanız, bir dize değil, bir liste sonucu alırsınız :sorted("abcd", reverse=True)
verir['d', 'c', 'b', 'a']
değil"dcba"