Проверка информации в наборе данных в Python - PullRequest
2 голосов
/ 21 октября 2011

В настоящее время у меня есть требование сделать сравнение строк, содержащих MAC-адреса (например, «11: 22: 33: AA: BB: CC» с использованием Python 2.7. В настоящее время у меня есть предварительно сконфигурированный набор, содержащий MAC-адрес иМой сценарий выполняет итерацию набора, сравнивая каждый новый MAC-адрес с теми, которые указаны в списке. Это прекрасно работает, но по мере роста набора сценарий значительно замедляется. Всего около 100 вы можете заметить огромную разницу.

Есть ли у кого-нибудь какие-либо советы по ускорению этого процесса? Является ли хранение их в наборе лучшим способом для сравнения или лучше хранить их, например, в CSV / DB?

Пример кода ...

def Detect(p): 
    stamgmtstypes = (0,2,4)
    if p.haslayer(Dot11):
        if p.type == 0 and p.subtype in stamgmtstypes:
            if p.addr2 not in observedclients: 
                # This is the set with location_mutex: 
                detection = p.addr2 + "\t" + str(datetime.now())
                print type(p.addr2)
                print detection, last_location
                observedclients.append(p.addr2) 

Ответы [ 3 ]

1 голос
/ 21 октября 2011

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

Также, в качестве общей рекомендации, рассмотрите psyco, хотя бывают случаи, когда psyco не помогает

Как только вы обнаружите узкое место, cython может быть полезным, но вы должны быть уверены, что объявляете все свои переменные в источнике Cython.

0 голосов
/ 22 октября 2011

В посте упоминается, что «сценарий перебирает наборы, сравнивая каждый новый MAC-адрес с теми, что в списке.»сравнения.Вместо этого используйте операции над множествами, такие как union () , intersection () и diff () :

s = set(list_of_strings_containing_mac_addresses)
t = set(preconfigured_set_of_mac_addresses)
print s - t, 'addresses in the list but not preconfigured'
0 голосов
/ 21 октября 2011

Попробуйте использовать set.Для объявления набора используйте set(), а не [] (поскольку последний объявляет пустой list).

Поиск в list имеет сложность O(n).Это то, что происходит в вашем случае, когда список увеличивается (сложность растет с ростом n как O(n)).

Поиск в set имеет в среднем O(1) сложность.

http://wiki.python.org/moin/TimeComplexity

Кроме того, вам нужно будет изменить некоторую часть вашего кода.В set нет метода append, поэтому вам нужно будет использовать что-то вроде observedclients.add(address).

...