В 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: Сравнение