我有一个很长的 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)
我会尝试将网络表示为整数列表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