Что набор.NET обеспечивает самому быстрому поиску

Поскольку файл setup.py устанавливается через pip (а сам pip запускается интерпретатором python), невозможно указать, какую версию Python использовать в файле setup.py.

Вместо этого взгляните на этот ответ - setup.py: ограничьте допустимую версию интерпретатора python , которая имеет основной обходной путь для остановки установки.

В вашем случае код будет:

import sys
if sys.version_info < (2,7):
    sys.exit('Sorry, Python < 2.7 is not supported')

136
задан Ondrej Janacek 28 July 2014 в 12:00
поделиться

7 ответов

В наиболее общем случае рассмотрите System.Collections.Generic.HashSet как структуру данных рабочей лошадки «Содержит» по умолчанию, поскольку для вычисления требуется постоянное время Содержит .

Фактический ответ на вопрос «Какая самая быстрая коллекция с возможностью поиска?» Зависит от конкретного размера данных, упорядоченности, стоимости хеширования и частоты поиска.

135
ответ дан 23 November 2019 в 23:39
поделиться

Если заказывать не нужно, попробуйте HashSet (новый для .Net 3.5)

Если да, используйте List < Запишите> и вызовите BinarySearch .

71
ответ дан 23 November 2019 в 23:39
поделиться

Сохраняйте оба списка x и y в отсортированном порядке.

Если x = y, выполните свое действие, если x

Время выполнения этого пересечения пропорционально min (size (x), size (y))

Не запускайте цикл .Contains (), это пропорционально x * y, что намного хуже.

4
ответ дан 23 November 2019 в 23:39
поделиться

Если вы используете .Net 3.5, вы можете сделать более чистый код, используя:

foreach (Record item in LookupCollection.Intersect(LargeCollection))
{
  //dostuff
}

У меня здесь нет .Net 3.5, поэтому он не тестировался. Он полагается на метод расширения. Не то, чтобы LookupCollection.Intersect (LargeCollection) , вероятно, не то же самое, что LargeCollection.Intersect (LookupCollection) ... последнее, вероятно, намного медленнее.

Это предполагает, что LookupCollection является HashSet

3
ответ дан 23 November 2019 в 23:39
поделиться

Рассматривали ли вы List.BinarySearch (item) ?

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

23
ответ дан 23 November 2019 в 23:39
поделиться

Если есть возможность отсортировать элементы, есть гораздо более быстрый способ сделать это, чем поиск ключей в хэш-таблице или b-дереве. Хотя, если ваши предметы не сортируются, вы все равно не сможете поместить их в b-дерево.

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

Walk lookup list
   While items in check list <= lookup list item
     if check list item = lookup list item do something
   Move to next lookup list item
3
ответ дан 23 November 2019 в 23:39
поделиться

Если вы не беспокоитесь о писке каждого последнего бита производительности, то предложение использовать HashSet или двоичный поиск является убедительным. Ваши наборы данных просто недостаточно велики, чтобы это было проблемой в 99% случаев.

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

2
ответ дан 23 November 2019 в 23:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: