Python 3.x 快速检查IP列表是否在IP范围列表中的方法(CIDR表示法)

Python 3.x 快速检查IP列表是否在IP范围列表中的方法(CIDR表示法),python-3.x,performance,ip-address,lookup,cidr,Python 3.x,Performance,Ip Address,Lookup,Cidr,我正在寻找一种快速的方法来检查IP地址是否是CIDR标记的IP范围列表的一部分。在使用NetAddress之前,我见过一些示例,如: from netaddr import IPNetwork, IPAddress for CIDR in CIDRLIST: if IPAddress(row[0]) in IPNetwork(CIDR): print('success') 然而,这个解决方案对于我的问题来说太慢了,CIDR中的800个IP范围和

我正在寻找一种快速的方法来检查IP地址是否是CIDR标记的IP范围列表的一部分。在使用NetAddress之前,我见过一些示例,如:

from netaddr import IPNetwork, IPAddress

    for CIDR in CIDRLIST:
        if IPAddress(row[0]) in IPNetwork(CIDR):
            print('success')
然而,这个解决方案对于我的问题来说太慢了,CIDR中的800个IP范围和500.000个IP地址


有什么方法可以更快地做到这一点?我读过关于使用pytries的文章,但我不确定这是解决方案。

Patricia/Radix tree/Trys似乎是答案。我通过搜索查找路由表的算法找到了它们

有一个python实现

稍后:我现在可以在Ruby中很好地工作:

require 'rpatricia' require 'uoainfoblox' ib = UoAIinfoblox.new ({'user' => 'xxxxx', 'password' => 'yyyy', 'host' => 'ipam.auckland.ac.nz'}) pt = Patricia.new ib.get_networks('*roaming_network=true').each do |net, info | pt.add(net) end puts "'130.216.66.65 #{ pt.include?('130.216.66.65')}" puts "130.216.5.128 #{pt.include?('130.216.5.128') }" Infoblox是一个IP管理系统,UoAInfoblox是其web api的包装器。所以这里我得到了一个漫游网络的列表,将它们添加到patricia树中,然后检查两个我知道其状态的IP地址


编辑:我刚从一位使用python并在CS系教授网络的朋友那里得知,他在研究脚本中使用了python基数模块。我知道他在为CAIDA处理来自a/8 Darknet的大量数据

使用列表理解而不是循环,看看这是否会提高性能。我想知道您是否可以在python中以任何性能实现Van Emde Boas树。我也有同样的问题-我非常确定答案是将块列表预处理为一棵树,然后搜索树。我已经学了40年了,我必须去查阅Knuth第三卷。谢天谢地,里面有些东西没有改变!我不认为vEB树可以很好地工作,因为您需要为块中的每个可能的IP构建带有密钥的树。假设我正确理解了维基百科的文章。