Мой совет - придерживаться встроенного set()
. Будет очень сложно написать код Python, который превосходит встроенный код C для производительности. Скорость построения и скорость поиска будут самыми быстрыми, если вы полагаетесь на встроенный код C.
Для отсортированного списка, лучше всего использовать встроенную функцию сортировки:
x = set(seq) # build set from some sequence
lst = sorted(x) # get sorted list from set
В общем, в Python, тем меньше кода вы пишете, тем быстрее она. Чем больше вы можете полагаться на встроенные C-основы Python, тем быстрее. Интерпретированный Python во многих случаях медленнее, чем код C, от 20x до 100x, и очень сложно быть настолько умным, что вы выходите вперед, а просто используете встроенные функции по назначению.
Если ваши наборы гарантированно всегда будут целыми числами в диапазоне от [0, 10], и вы хотите, чтобы размер памяти был как можно меньше, тогда битовые флаги внутри целого числа будут способом идти.
pow2 = [2**i for i in range(32)]
x = 0 # set with no values
def add_to_int_set(x, n):
return x | pow2[n]
def in_int_set(x, n):
return x & pow2[n]
def list_from_int_set(x):
return [i for i in range(32) if x & pow2[i]]
Я буду держать пари, что это на самом деле медленнее, чем при использовании встроенного set()
функций, но вы знаете, что каждый набор будет только быть int
объект: 4 байта, плюс накладные расходы объекта Python.
Если вы буквально нуждались в миллиардах из них, вы могли бы сэкономить место, используя NumPy array
вместо списка Python; NumPy array
просто сохранит простые целые числа. Фактически, NumPy имеет 16-разрядный целочисленный тип, поэтому, если ваши наборы действительно находятся только в диапазоне [0, 10], вы можете получить размер хранилища до двух байтов с помощью NumPy array
.
http://www.scipy.org/FAQ#head-16a621f03792969969e44df8a9eb360918ce9613
все, что только 10 элементов в нем будут достаточно быстрыми. – sjr
Что делать, если я хочу построить миллионы из них? :-) – antony
сто миллионов элементов, 400 МБ, если они ints, некоторые накладные расходы, у вас есть 500 МБ в памяти. Задняя часть расчетов конвертов показывает, что встроенные коллекции должны быть в порядке – sjr