Поскольку файл 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')
В наиболее общем случае рассмотрите System.Collections.Generic.HashSet
как структуру данных рабочей лошадки «Содержит» по умолчанию, поскольку для вычисления требуется постоянное время Содержит
.
Фактический ответ на вопрос «Какая самая быстрая коллекция с возможностью поиска?» Зависит от конкретного размера данных, упорядоченности, стоимости хеширования и частоты поиска.
Если заказывать не нужно, попробуйте HashSet
(новый для .Net 3.5)
Если да, используйте List < Запишите>
и вызовите BinarySearch
.
Сохраняйте оба списка x и y в отсортированном порядке.
Если x = y, выполните свое действие, если x Время выполнения этого пересечения пропорционально min (size (x), size (y)) Не запускайте цикл .Contains (), это пропорционально x * y, что намного хуже.
Если вы используете .Net 3.5, вы можете сделать более чистый код, используя:
foreach (Record item in LookupCollection.Intersect(LargeCollection))
{
//dostuff
}
У меня здесь нет .Net 3.5, поэтому он не тестировался. Он полагается на метод расширения. Не то, чтобы LookupCollection.Intersect (LargeCollection)
, вероятно, не то же самое, что LargeCollection.Intersect (LookupCollection)
... последнее, вероятно, намного медленнее.
Это предполагает, что LookupCollection является HashSet
Рассматривали ли вы List.BinarySearch (item)
?
Вы сказали, что ваша большая коллекция уже отсортирована, так что это прекрасная возможность? Хеширование определенно будет самым быстрым, но это создает свои собственные проблемы и требует гораздо больше накладных расходов на хранение.
Если есть возможность отсортировать элементы, есть гораздо более быстрый способ сделать это, чем поиск ключей в хэш-таблице или 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
Если вы не беспокоитесь о писке каждого последнего бита производительности, то предложение использовать HashSet или двоичный поиск является убедительным. Ваши наборы данных просто недостаточно велики, чтобы это было проблемой в 99% случаев.
Но если это только один из тысяч раз, вы собираетесь это сделать, и производительность критична (и доказано, что это неприемлемо используя HashSet / бинарный поиск), вы, безусловно, можете написать свой собственный алгоритм, который проходил бы отсортированные списки, выполняя сравнения по мере вашего продвижения. Каждый список будет просматриваться не более одного раза, и в патологических случаях это было бы неплохо (как только вы пойдете по этому маршруту, вы, вероятно, обнаружите, что сравнение, предполагающее, что это строка или другое нецелое значение, будет реальными расходами и эта оптимизация будет следующим шагом).