[Python] Лучше / Быстрее, чтобы петли через набор или список?


Answers

set - это то, что вы хотите, поэтому вы должны использовать set . Попытка быть умным вводит тонкие ошибки, как забывая добавить один к max(mylist) ! Код защищен. Беспокойство о том, что быстрее, когда вы определяете, что он слишком медленный.

range(min(mylist), max(mylist) + 1)  # <-- don't forget to add 1
Question

Если у меня есть список python, у которого много дубликатов, и я хочу перебирать каждый элемент, но не через дубликаты, лучше использовать набор (как в set(mylist) , либо найти другой способ создания списка без дубликатов? Я думал просто перебирать список и проверять дубликаты, но я решил, что это то, что set() делает, когда оно инициализировано.

Так что если mylist = [3,1,5,2,4,4,1,4,2,5,1,3] и я действительно просто хочу пройти через [1,2,3,4,5] (заказ не имеет значения), следует ли использовать set(mylist) или что-то еще?

Альтернатива возможна в последнем примере, так как список содержит каждое целое число между его минимальным и максимальным значением, я мог бы перебирать range(min(mylist),max(mylist)) или через set(mylist) . Должен ли я вообще стараться избегать использования набора в этом случае? Кроме того, будет ли поиск min и max медленнее, чем просто создание set ?

В последнем примере set выполняется быстрее:

from numpy.random import random_integers
ids = random_integers(1e3,size=1e6)

def set_loop(mylist):
    idlist = []
    for id in set(mylist):
        idlist.append(id)
    return idlist

def list_loop(mylist):
    idlist = []
    for id in range(min(mylist),max(mylist)):
        idlist.append(id)
    return idlist

%timeit set_loop(ids)
#1 loops, best of 3: 232 ms per loop

%timeit list_loop(ids)
#1 loops, best of 3: 408 ms per loop



Для простоты: newList = list(set(oldList))

Но есть лучшие варианты, если вы хотите получить скорость / порядок / оптимизацию: http://www.peterbe.com/plog/uniqifiers-benchmark