Получение пересечения между двумя пространствами CIDR, когда у вас есть огромные наборы данных - PullRequest
0 голосов
/ 06 ноября 2018

По сути, у меня есть список IP-подсетей (supernets), который содержит около 100 элементов. В то же время у меня есть еще один список (ips), который содержит около 300 тыс. IP-адресов / сетей.

Пример:

supernets = ['10.10.0.0/16',  '12.0.0.0/8']

ips = ['10.10.10.1', '10.10.10.8/30', '12.1.1.0/24']

Конечная цель - классифицировать IP-адреса в зависимости от того, где они находятся в суперсети.

Поэтому я сравнил каждый IP-адрес / элемент сети во 2-м списке с первым элементом в списках суперсети и т. Д.

По сути, я делаю это:

for i in range(len(supernets)):
    for x in ips:
        if IPNetwork(x) in IPNetwork(sorted(supernets)[i]):
            print(i, x, sorted(supernets)[i])
            lod[i][sorted(supernets)[i]].append(x)

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

UPDATE

Вместо этого я отсортировал списки и использовал их понимание, а запуск сценария занял около 11 минут, что является хорошей оптимизацией с точки зрения скорости. Но процессор все еще 100% в течение целых 11 минут.

[lod[i][public[i]].append(x) for i in range(len(public)) for x in ips if IPNetwork(x) in IPNetwork((public)[i])]
...