拥有大量数据集时在2个CIDR空间之间获得交集

时间:2018-11-05 21:42:35

标签: python-3.x multithreading inetaddress

基本上,我有一个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])]

0 个答案:

没有答案