回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我模拟ip列表和子网dict作为输入:</p>
<pre><code># ip address list
ip_list = [
'192.168.1.151', '192.168.10.191', '192.168.6.127',
'192.168.2.227', '192.168.2.5', '192.168.3.237',
'192.168.6.188', '192.168.7.209', '192.168.9.10',
# Edited: add some /28, /16 case
'192.168.12.39', '192.168.12.58', '10.63.11.1', '10.63.102.69',
]
# subnet dict
netsets = {
'192.168.1.0/24': 'subnet-A', # {subnet: subnet's name}
'192.168.10.0/24': 'subnet-B',
'192.168.2.0/24': 'subnet-C',
'192.168.3.0/24': 'subnet-C',
'192.168.6.0/24': 'subnet-D',
'192.168.7.0/24': 'subnet-D',
'192.168.9.0/24': 'subnet-E',
# Edited: add some /28, /16 case
'192.168.12.32/28': 'subnet-F',
'192.168.12.48/28': 'subnet-G',
'10.63.0.0/16': 'subnet-I',
}
</code></pre>
<p>然后,<code>ip_list</code>中的每个ip地址都需要找到子网的名称。在</p>
<p>我们假设每个ip地址都可以在<code>netsets</code>中找到对应的子网。在</p>
<p>输出如下:</p>
^{pr2}$
<p>我使用<a href="https://github.com/drkjam/netaddr" rel="nofollow">netaddr</a>计算CIDR,以下是我的代码:</p>
<pre><code>from netaddr import IPAddress, IPNetwork
def netaddr_test(ips, netsets):
for ip in ips:
for subnet, name in netsets.iteritems():
if IPAddress(ip) in IPNetwork(subnet):
print ip, '\t', name
break
netaddr_test(ip_list, netsets)
</code></pre>
<p>但是这段代码太慢了,迭代太多了。时间的复杂性是O(n**2)。在</p>
<p>一旦我们有数万个ip要迭代,这段代码花费的时间太多了。在</p>
<p>有没有更好的办法来解决这个问题?在</p>