В Python, какая структура данных является более эффективной / быстрой? Предполагая, что порядок не важен для меня, и я все равно буду проверять наличие дубликатов, является ли набор Python более медленным, чем список Python?
python
list
performance
data-structures
set
Мантас Видутис
источник
источник
Списки немного быстрее, чем наборы, когда вы просто хотите перебрать значения.
Наборы, однако, значительно быстрее, чем списки, если вы хотите проверить, содержится ли в них элемент. Они могут содержать только уникальные предметы.
Оказывается, кортежи работают почти так же, как списки, за исключением их неизменности.
Итерация
Определить, присутствует ли объект
источник
Список производительности:
Установить производительность:
Возможно, вы захотите рассмотреть кортежи, так как они похожи на списки, но не могут быть изменены. Они занимают немного меньше памяти и имеют более быстрый доступ. Они не так гибки, но более эффективны, чем списки. Их обычное использование - служить словарными ключами.
Наборы также являются структурами последовательностей, но с двумя отличиями от списков и кортежей. Хотя наборы имеют порядок, этот порядок является произвольным и не контролируется программистом. Второе отличие состоит в том, что элементы в наборе должны быть уникальными.
set
по определению. [ питон | вики ].источник
set
ссылку встроенного типа ( docs.python.org/2/library/stdtypes.html#set ), а не устаревшуюsets
библиотеку. Во-вторых, «Наборы также являются структурами последовательностей», считайте следующее из ссылки встроенного типа: «Будучи неупорядоченной коллекцией, наборы не записывают положение элемента или порядок вставки. Соответственно, наборы не поддерживают индексацию, нарезку или другие последовательное поведение. "range
неlist
.range
это специальный класс с пользовательским__contains__
магическим методом.xrange
)Set
выигрывает из-за почти мгновенных проверок "содержит": https://en.wikipedia.org/wiki/Hash_tableРеализация списка : обычно массив, низкий уровень, близкий к металлу, хороший для итерации и произвольного доступа по индексу элемента.
Реализация набора : https://en.wikipedia.org/wiki/Hash_table , он не выполняет итерацию по списку, но находит элемент, вычисляя хеш-код из ключа, поэтому он зависит от природы ключевых элементов и хеш-функции. функция. Подобно тому, что используется для dict. Я подозреваю, что
list
может быть быстрее, если у вас очень мало элементов (<5), чем больше число элементов, тем лучшеset
будет проверка содержимого. Это также быстро для добавления и удаления элементов. Также всегда помните, что создание набора имеет свою стоимость!ПРИМЕЧАНИЕ . Если объект
list
уже отсортирован, поискlist
может быть довольно быстрым, но в обычных случаяхset
он быстрее и проще для проверок содержимого.источник
ТЛ; др
Структуры данных (DS) важны, потому что они используются для выполнения операций с данными, что в основном подразумевает: принять некоторый ввод , обработать его и вернуть вывод .
Некоторые структуры данных более полезны, чем другие в некоторых конкретных случаях. Поэтому довольно несправедливо спрашивать, какой (DS) является более эффективным / быстрым. Это все равно, что спросить, какой инструмент более эффективен между ножом и вилкой. Я имею в виду, все зависит от ситуации.
Списки
Список является изменяемой последовательностью , обычно используемой для хранения коллекций однородных элементов. .
наборы
Заданный объект - это неупорядоченная коллекция различных хешируемых объектов. . Он обычно используется для проверки членства, удаления дубликатов из последовательности и вычисления математических операций, таких как пересечение, объединение, разность и симметричная разность.
использование
Из некоторых ответов ясно, что список выполняется быстрее, чем набор при переборе значений. С другой стороны, набор быстрее списка, когда проверяется, содержится ли в нем элемент. Следовательно, единственное, что вы можете сказать, это то, что список лучше, чем набор для некоторых конкретных операций, и наоборот.
источник
Меня интересовали результаты при проверке с помощью CPython, является ли значение одним из небольшого числа литералов.
set
выигрывает в Python 3 противtuple
,list
иor
:Вывод:
От 3 до 5 литералов
set
все еще выигрывает с большим отрывом иor
становится самым медленным.В Python 2
set
всегда самый медленный.or
является самым быстрым для 2 до 3 литер, аtuple
иlist
быстрее с 4 или более литералов. Я не мог отличить скоростьtuple
противlist
.Когда тестируемые значения кэшировались в глобальной переменной вне функции, вместо создания литерала в цикле,
set
каждый раз выигрывал, даже в Python 2.Эти результаты применимы к 64-битному CPython на Core i7.
источник
Я бы порекомендовал реализацию Set, где вариант использования ограничен ссылками или поиском существования, и реализацию Tuple, где вариант использования требует от вас выполнения итерации. Список является низкоуровневой реализацией и требует значительных накладных расходов памяти.
источник
Вывод после сравнения 10 итераций для всех 3: Сравнение
источник
Наборы работают быстрее, но вы получаете больше функций с наборами, например, допустим, у вас есть два набора:
Мы можем легко объединить два набора:
Узнайте, что общего в обоих:
Узнайте, что отличается в обоих:
И многое другое! Просто попробуйте, они веселые! Более того, если вам приходится работать с различными значениями в двух списках или общими значениями в двух списках, я предпочитаю преобразовывать ваши списки в наборы, и многие программисты делают это таким образом. Надеюсь, это поможет вам :-)
источник