基本上,我有一个IP子网列表(supernets
),其中包含大约100个元素。同时,我还有另一个列表(ips
)包含大约300k的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地址/网络元素与超网列表中的第一个元素,依此类推。
基本上,我是这样做的:
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)
这可以正常工作,但是要花很长时间,并且CPU会发疯,所以我的问题是,是否有任何方法或简洁的代码可以实现这一目标并节省时间?
更新
我对列表进行了排序,并使用了列表理解功能, 脚本花费了大约11分钟的时间来运行,这是一个很好的优化 的速度。但是在整个11分钟内,CPU仍然是100%。
[lod[i][public[i]].append(x) for i in range(len(public)) for x in ips if IPNetwork(x) in IPNetwork((public)[i])]