Получение пересечения между двумя пространствами CIDR, когда у вас есть огромные наборы данных
В принципе, у меня есть список 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)
Это работает нормально, но это занимает много времени, и процессор сходит с ума, поэтому мой вопрос, есть ли методология или чистый код, который может достичь этого и сэкономить время?
ОБНОВИТЬ
Вместо этого я отсортировал списки и использовал их понимание, и запуск сценария занял около 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])]