Время, затрачиваемое на набор против списка с помощью for и if

#python #list #data-structures #set

#python #Список #структуры данных #набор

Вопрос:

У меня есть две коллекции, и мне нужно выяснить, есть ли у этих двух коллекций что-то общее, и если они что-то делают, то что это. Я могу сделать это, используя списки и for и if или наборы и найдя пересечение. но мне также нужно минимизировать время, затрачиваемое на запуск.

Какой из двух подходов более эффективен по времени? Примечание: Различия в масштабе секунды также важны.

РЕДАКТИРОВАТЬ: под коллекцией я подразумеваю набор значений. например, чтение из csv. я могу поместить их в список или набор для дальнейших операций. Пример: a = [‘D’, ‘C’,’B’,’A’] b = [‘A’, ‘B’, E’, Z’, ‘N’,’W’]

Теперь я могу сделать это следующими способами?

 common=[]
for item in a:
    if item not in b:
        common.append(item)
  

использование понимания списка

 common=[item for item in a if item not in b]
  

использование set

 set(a) amp; set(b)
  

Я не могу использовать команду just time из Linux, поскольку она сильно варьируется от системы к системе

Комментарии:

1. Что такое коллекция ? Вы имеете в виду какой-то элемент collections модуля? Как вы делаете это, используя списки и for и if или наборы ? Пожалуйста, покажите какой-нибудь код.

2. Реализуйте оба. Измерение. Вот ваш ответ.

3. Реализуйте оба для 100 000 элементов или около того и просто посмотрите, что произойдет, чувак.

4. Я не понимаю комментарий о времени, «сильно различающемся от системы к системе». Не имеет значения, если оно не согласовано между системами, вам нужно только измерить в одной системе, чтобы выяснить, какой метод быстрее.

5. Предполагая, что a и b являются обоими наборами, тогда средний должен быть лучше, поскольку это будет сделано на C. Если a и b являются списками с большим количеством элементов, то «set (a) amp; set (b)» должно быть быстрее. В противном случае это бросок между средним и последним с небольшим шансом для первого. На самом деле, как упоминали другие, лучше всего просто определить время или профилировать его в любом случае, если вас это беспокоит.

Ответ №1:

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

При этом ваш вариант понимания почти наверняка будет быстрее, чем вариант цикла for, потому что неявные циклы обычно быстрее явных. Обратите внимание, что даже в документации по этой ссылке есть это предостережение:

Какой метод подходит, будет зависеть от того, какую версию Python вы используете, и характеристик данных, которыми вы манипулируете.

Я не совсем понимаю вашу озабоченность по поводу использования команды Linux time, it. Общее время процессора, указанное в time, является достойным способом рассчитать общее время, необходимое вашему сценарию для запуска. Это не дает вам возможности проверить эффективность вашего цикла в частности, но если вы не видите разницы в времени вывода между вашими тремя методами, то это не узкое место, и вам все равно не стоит беспокоиться об этом.

TL; DR
Нет ярлыка для профилирования. Используйте любой из профилировщиков Python, чтобы определить свои узкие места и сосредоточить на них свое внимание. Вывод профилировщика сообщит вам, какой из предложенных вами методов является лучшим в вашем случае для данных, которые вы обрабатываете.