Python 长 IP 子网数组(可以工作,但速度很慢)

Mar*_*vin 1 python python-3.x

我有一个很长的 IP 子网数组(+/- 1000 个条目,800 万个 IP),我想检查某些 IP(列表)是否在该数组中。我的代码有效。但速度相当“慢”。由于我必须查找多个 IP 地址,因此我希望搜索速度更快。有没有什么方法可以改善数组的搜索?

数组示例:

nets = [
    '192.168.1.0/24',
    '192.168.2.0/24',
    '192.168.3.0/24',
]
Run Code Online (Sandbox Code Playgroud)

要搜索的代码:

def search(ip_address):
    for net in nets:
        if ipaddress.ip_address(ip_address) in ipaddress.ip_network(net):
            return True
    return False
Run Code Online (Sandbox Code Playgroud)

Tom*_*lak 5

我会尝试将网络表示为整数列表range

from ipaddress import ip_address, ip_network

nets = [
    '192.168.1.0/24',
    '192.168.2.0/24',
    '192.168.3.0/24',
]

ip_ranges = [
    (range(int(n.network_address), int(n.broadcast_address)), n)
    for n in map(ip_network, nets)
]

ip = int(ip_address('192.168.2.10'))

results = [n for r, n in ip_ranges if ip in r]
print(results)
Run Code Online (Sandbox Code Playgroud)

我没有测量它,但对于 30,000 个网络来说似乎相当快。(我这样做只是nets * 10000为了增加数字,并且几乎立即print(len(results))就想出来了。)10000