【发布时间】:2017-10-24 12:35:13
【问题描述】:
我正在寻找一种快速的方法来检查 IP 地址是否属于 CIDR 标记的 IP 范围列表的一部分。我在使用 netaddr 之前看过一些示例,例如:
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 的信息,但我不确定这是否是解决方案。
【问题讨论】:
-
使用列表推导而不是循环,看看是否能提高性能。
-
我想知道您是否可以在 python 中实现具有任何性能的“Van Emde Boas Tree”。
-
我有同样的问题——我很确定答案是将块列表预处理成树,然后搜索树。自从我研究这些东西已经 40 年了,我将不得不去查阅 Knuth 第 3 卷。谢天谢地,IT 中的一些事情没有改变!我不认为 vEB 树会很好地工作,因为您需要为块中每个可能的 IP 构建带有密钥的树。 (假设我正确理解了维基百科的文章)。
标签: python-3.x performance ip-address lookup cidr