Наборы Python против списков

В Python, какая структура данных более эффективна/ускорена? Предполагая, что этот порядок не важен для меня, и я все равно проверял бы дубликаты, является ли Python медленнее, чем список Python?

Ответ 1

Это зависит от того, что вы собираетесь с ним делать.

Установки значительно быстрее, когда дело доходит до определения того, присутствует ли объект в наборе (как в x in s), но медленнее, чем списки, когда дело доходит до итерации по их содержимому.

Вы можете использовать модуль timeit, чтобы узнать, что быстрее для вашей ситуации.

Ответ 2

Списки немного быстрее, чем наборы, когда вы просто хотите перебирать значения.

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

Оказывается, кортежи выполняются почти так же, как списки, за исключением их неизменности.

Итерация

>>> def iter_test(iterable):
...     for i in iterable:
...         pass
...
>>> from timeit import timeit
>>> timeit(
...     "iter_test(iterable)",
...     setup="from __main__ import iter_test; iterable = set(range(10000))",
...     number=100000)
12.666952133178711
>>> timeit(
...     "iter_test(iterable)",
...     setup="from __main__ import iter_test; iterable = list(range(10000))",
...     number=100000)
9.917098999023438
>>> timeit(
...     "iter_test(iterable)",
...     setup="from __main__ import iter_test; iterable = tuple(range(10000))",
...     number=100000)
9.865639209747314

Определить, присутствует ли объект

>>> def in_test(iterable):
...     for i in range(1000):
...         if i in iterable:
...             pass
...
>>> from timeit import timeit
>>> timeit(
...     "in_test(iterable)",
...     setup="from __main__ import in_test; iterable = set(range(1000))",
...     number=10000)
0.5591847896575928
>>> timeit(
...     "in_test(iterable)",
...     setup="from __main__ import in_test; iterable = list(range(1000))",
...     number=10000)
50.18339991569519
>>> timeit(
...     "in_test(iterable)",
...     setup="from __main__ import in_test; iterable = tuple(range(1000))",
...     number=10000)
51.597304821014404

Ответ 3

Производительность списка:

>>> import timeit
>>> timeit.timeit(stmt='10**6 in a', setup='a = range(10**6)', number=100000)
0.008128150348026608

Установите производительность:

>>> timeit.timeit(stmt='10**6 in a', setup='a = set(range(10**6))', number=100000)
0.005674857488571661

Возможно, вы захотите рассмотреть Tuples, поскольку они похожи на списки, но не могут быть изменены. Они занимают немного меньше памяти и быстрее доступны. Они являются гибкими, но эффективнее списков. Их нормальное использование - это словарные ключи.

Наборы также представляют собой структуры последовательности, но с двумя отличиями от списков и кортежей. Хотя у наборов есть порядок, этот порядок произволен, а не под управлением программистов. Второе отличие состоит в том, что элементы в наборе должны быть уникальными.

set по определению. [python | wiki].

>>> x = set([1, 1, 2, 2, 3, 3])
>>> x
{1, 2, 3}

Ответ 4

Set выигрывает из-за почти мгновенного "содержит" чеков: https://en.wikipedia.org/wiki/Hash_table

Список: обычно массив, низкий уровень рядом с металлом, подходит для итерации и произвольного доступа по индексу элемента.

Установить: https://en.wikipedia.org/wiki/Hash_table, он не перебирает список, а находит элемент по вычисляя хэш из ключа, поэтому он зависит от характера ключевых элементов и хэш-функции. Подобно тому, что используется для dict. Я подозреваю, что list может быть быстрее, если у вас очень мало элементов (< 5), чем больше элемент, тем лучше Set будет выполнять проверку наличия. Он также быстро добавляет и удаляет элементы.

ПРИМЕЧАНИЕ. Если list уже отсортирован, поиск в list может быть довольно быстрым, но для обычных случаев a Set быстрее и проще содержит проверочные проверки.

Ответ 5

Я бы порекомендовал реализацию Set, где прецедент является предел для ссылки или поиска для существования и реализации Tuple, где для использования используется итерация. Список представляет собой реализацию на низком уровне и требует значительных издержек памяти.

Ответ 6

ТЛ; др

Структуры данных (DS) важны, потому что они используются для выполнения операций с данными, что в основном подразумевает: принять некоторый ввод, обработать его и вернуть вывод.

Некоторые структуры данных более полезны, чем другие в некоторых конкретных случаях. Поэтому довольно несправедливо спрашивать, какой (DS) является более эффективным/быстрым. Это все равно, что спросить, какой инструмент более эффективен между ножом и вилкой. Я имею в виду, все зависит от ситуации.

Списки

Список является изменяемой последовательностью, обычно используемой для хранения коллекций однородных элементов.

наборы

Заданный объект - это неупорядоченная коллекция различных хеш-объектов. Он обычно используется для проверки членства, удаления дубликатов из последовательности и вычисления математических операций, таких как пересечение, объединение, разность и симметричная разность.

использование

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

Ответ 7

from datetime import datetime
listA = range(10000000)
setA = set(listA)
tupA = tuple(listA)
#Source Code

def calc(data, type):
start = datetime.now()
if data in type:
print ""
end = datetime.now()
print end-start

calc(9999, listA)
calc(9999, tupA)
calc(9999, setA)

Вывод после сравнения 10 итераций для всех 3: Сравнение