Мы попытаемся выяснить, что быстрее между sort(), sorted() и reverse(), reversed().

Сортировать и сортировать

И sort, и sorted используются для сортировки элементов в списке. Есть два отличия

  • Sorted() — это встроенная функция Python, а sort() — метод класса list.
  • Sorted() возвращает список с отсортированными элементами, тогда как sort() является методом на месте. Он обновляет исходный список.
import random
lst1 = [random.randint(0,10) for _ in range(5)]
print(lst1)
print(lst1.sort())
print(lst1)
'''
OUTPUT
[2, 9, 10, 7, 0]
None
[0, 2, 7, 9, 10]
'''

Как видите, второй оператор печати выводит None, поскольку sort() является методом на месте. В третьем операторе печати, когда мы печатаем lst1, мы видим, что элементы отсортированы.

import random
lst1 = [random.randint(0,10) for _ in range(5)]
print(lst1)
print(sorted(lst1))
print(lst1)
'''
OUTPUT
[3, 6, 7, 5, 5]
[3, 5, 5, 6, 7]
[3, 6, 7, 5, 5]
'''

В отличие от sort(), второй оператор печати выводит список с отсортированными элементами, а третий оператор печати выводит список в исходном порядке.

Сравнение времени, затрачиваемого на сортировку и сортировку

У нас есть список из 1000 элементов, и мы попробуем отсортировать его обоими способами.

import time
import random
lst1=[random.randint(1,1000) for i in range(1000)]
lst2 = lst1.copy()
s1 = time.perf_counter()
sorted(lst1)
print(f'It took {time.perf_counter() - s1} seconds for sorted()')
s1 = time.perf_counter()
lst2.sort()
print(f'It took {time.perf_counter() - s1} seconds for sort()')

Ниже приведен вывод

It took 0.00015853159129619598 seconds for sorted()
It took 0.0010612830519676208 seconds for sort()

Кажется, sorted() работает быстрее, но давайте попробуем запустить его снова.

It took 0.00016496609896421432  seconds for sorted()
It took 0.00013628974556922913 seconds for sort()

Хм, кажется, на этот раз сортировка немного быстрее

Тест кажется неубедительным, давайте попробуем что-нибудь другое
Мы проведем приведенное выше сравнение 25 раз и на каждой итерации будем проверять, какой метод оказался быстрее.

import time
import random
sort_count = 0
sorted_count = 0
for i in range(25):
    print(f'Iteration {i}')
    lst1=[random.randint(1,1000) for i in range(1000)]
    lst2 = lst1.copy()
    s1 = time.perf_counter()
    sorted(lst1)
    sorted_time = time.perf_counter() - s1
    s1 = time.perf_counter()
    lst2.sort()
    sort_time = time.perf_counter() - s1
    if sorted_time < sort_time:
        sorted_count += 1
    else:
        sort_count += 1
print(f'sort_count is {sort_count}')
print(f'sorted_count is {sorted_count}')

Ниже приведен вывод

sort_count is 22
sorted_count is 3

Основываясь на приведенном выше эксперименте, кажется, что сортировка выполняется быстрее, чем сортировка при попытке отсортировать один и тот же список.

Обратный и обратный

reverse() и reversed() аналогичны sort() и sorted() соответственно. reverse() — это встроенная функция Python, а reverse() — метод класса списка. Единственная разница между sorted() и reversed() заключается в том, что sorted() возвращает объект списка, а reversed() возвращает объект list_reverseiterator, который можно преобразовать в список с помощью list().

Я не буду приводить этот пример, так как он похож на примеры, рассмотренные в предыдущем разделе. Мы перейдем к более интересным вещам, а именно к сравнению производительности.

import time
import random
reverse_count = 0
reversed_count = 0
for i in range(25):
    print(f'Iteration {i}')
    lst1=[random.randint(1,1000) for i in range(1000)]
    lst2 = lst1.copy()
    s1 = time.perf_counter()
    reversed(lst1)
    reversed_time = time.perf_counter() - s1
    s1 = time.perf_counter()
    lst2.reverse()
    reverse_time = time.perf_counter() - s1
    if reversed_time < reverse_time:
        reversed_count += 1
    else:
        reverse_count += 1
print(f'reversed_count is {reversed_count}')
print(f'reverse_count is {reverse_count}')

Ниже приведен вывод

reversed_count is 0
reverse_count is 25

Кажется, что reverse() — явный победитель

Резюме

  • sort() и reverse() являются методами объекта списка и обновляют исходный список.
  • sorted() возвращает список с отсортированными элементами
  • reversed() возвращает объект list_reverseiterator
  • Основываясь на наших экспериментах выше, sort() работает быстрее, чем sorted(), а reverse() быстрее, чем reverse().

Первоначально опубликовано на https://www.realpythonproject.com 9 апреля 2021 г.