Самый быстрый способ поиска списка в python

Когда вы делаете что-то вроде "test" in a где a является списком, выполняет ли python последовательный поиск в списке или создает ли представление хеш-таблицы для оптимизации поиска? В приложении мне это нужно, потому что я буду много искать в списке, так что лучше бы сделать что-то вроде b = set(a) а затем "test" in b ? Также обратите внимание, что список значений, которые у меня будут, не будет иметь повторяющихся данных, и я действительно не забочусь о том, в каком порядке он находится; Мне просто нужно проверить наличие ценности.

4 Solutions collect form web for “Самый быстрый способ поиска списка в python”

Также обратите внимание, что список значений, которые у меня будут, не будет иметь повторяющихся данных, и я действительно не забочусь о том, в каком порядке он находится; Мне просто нужно проверить наличие ценности.

Не используйте список, используйте вместо него set() . Он имеет именно те свойства, которые вы хотите, включая быстрый тест.

Я видел ускорение в 20 раз и выше по местам (в основном тяжелое число хруст), где один список был изменен для набора.

"test" in a со списком a будет выполнять линейный поиск. Настройка хеш-таблицы на лету будет намного дороже, чем линейный поиск. "test" in b с другой стороны, сделает анимированный O (1) хэш-поиск.

В случае, когда вы описываете, не существует причины использовать список по набору.

Я думаю, было бы лучше пойти с установленной реализацией. Я знаю, что наборы имеют O (1) время поиска. Я думаю, что списки берут O (n) время поиска. Но даже если списки также относятся к O (1), вы ничего не теряете при переключении на наборы.

Кроме того, наборы не позволяют дублировать значения. Это сделает вашу программу немного более эффективной с точки зрения памяти

Кажется, что список и кортежи имеют одинаковое время, а использование «in» медленнее для больших данных:

 >>> t = list(range(0, 1000000)) >>> a=time.time();x = [b in t for b in range(100234,101234)];print(time.time()-a) 1.66235494614 >>> t = tuple(range(0, 1000000)) >>> a=time.time();x = [b in t for b in range(100234,101234)];print(time.time()-a) 1.6594209671 

Здесь гораздо лучшее решение: наиболее эффективный способ поиска / поиска в огромном списке (python)

Это супер быстро:

 >>> from bisect import bisect_left >>> t = list(range(0, 1000000)) >>> a=time.time();x = [t[bisect_left(t,b)]==b for b in range(100234,101234)];print(time.time()-a) 0.0054759979248 
  • Python: TypeError: индексы списка должны быть целыми числами, а не списком
  • Как использовать быструю сортировку для сортировки по индексу в списке списка
  • Распаковать список в Python?
  • Когда следует использовать list.count (0) и как мне сбрасывать товар «False»?
  • Почему кортеж быстрее, чем список?
  • запуск PIL на 64-битной
  • Python: подсчитать частоту слов в списке
  • Преобразование словаря Python в список
  • Python - лучший язык программирования в мире.