У меня есть набор из примерно 200 000 IP-адресов и 10 000 подсетей вида (1.1.1.1/24). Для каждого IP-адреса мне нужно проверить, принадлежит ли он одной из этих подсетей, но, поскольку это такой большой набор данных, и у меня меньше вычислительных мощностей, мне нужна эффективная реализация для этого.
При поиске я нашел один метод (https://stackoverflow.com/a/820124/7995937):
from netaddr import IPNetwork, IPAddress
if IPAddress("192.168.0.1") in IPNetwork("192.168.0.0/24"):
print "Yay!"
Но поскольку мне приходится перебирать 200 000 IP-адресов в цикле, а для каждого цикла адресов более 10 000 подсетей, я не уверен, что это эффективно. Мое первое сомнение: проверка «IPAddress () в IPNetwork ()» - это просто линейное сканирование или это каким-то образом оптимизировано?
Другое решение, которое я придумал, заключалось в том, чтобы составить список со всеми IP-адресами, содержащимися в IP-подсетях (что составляет около 13000000 IP-адресов без дубликатов), а затем отсортировать его. Если я это сделаю, то в моем цикле из 200 000 IP-адресов мне нужно будет только выполнить двоичный поиск для каждого IP-адреса по большему набору IP-адресов.
for ipMasked in ipsubnets: # Here ipsubnets is the list of all subnets
setUnmaskedIPs = [str(ip) for ip in IPNetwork(ipMasked)]
ip_list = ip_list + setUnmaskedIPs
ip_list = list(set(ip_list)) # To eliminate duplicates
ip_list.sort()
Затем я мог бы просто выполнить двоичный поиск следующим образом:
for ip in myIPList: # myIPList is the list of 200,000 IPs
if bin_search(ip,ip_list):
print('The ip is present')
Этот метод более эффективен, чем другой? Или есть другой более эффективный способ выполнить эту задачу?