<p>我建议避免在for循环中创建新实例。这不会降低复杂性(它会增加复杂性),但会加快<code>netaddr_test</code>,特别是当它被多次调用时。示例:</p>
<pre><code>def _init(ips, netsets):
"""Initialize all objects"""
new_ips = []
new_subs = {}
for ip in ips:
new_ips.append(IPAddress(ip))
for subnet, info in netsets.iteritems():
new_subs[subnet] = {'name': info, 'subnet': IPNetwork(subnet)}
return new_ips, new_subs
def netaddr_test(ips, netsets):
for ip in ips:
for stringnet, info in netsets.iteritems():
if ip in info['subnet']:
print ip, '\t', info['name']
break
ni, ns = _init(ip_list, netsets)
netaddr_test(ni, ns)
</code></pre>
<p>更新:用测试了上面的代码</p>
^{pr2}$
<p>结果:</p>
<pre><code># Original
$ time python /tmp/test.py > /dev/null
real 0m0.357s
user 0m0.345s
sys 0m0.012s
# Modified
$ time python /tmp/test2.py > /dev/null
real 0m0.126s
user 0m0.122s
sys 0m0.005s
</code></pre>
<p>现在,我从未使用过<code>netaddr</code>,所以我不确定它如何在内部处理子网。在您的例子中,您可以将子网视为一个IP范围,每个IP都是<code>uint_32</code>,因此您可以将所有内容转换为整数:</p>
<pre><code> # IPs now are
ip_list_int = [3232235927, 3232238271, ...]
netsets_expanded = {
'192.168.1.0/24': {'name': 'subnet-A', 'start': 3232235776, 'end': 3232236031}
</code></pre>
<p><code>netaddr</code>可用于转换上述格式的数据。一旦到达,您的<code>netaddr_test</code>变成(并且仅适用于整数比较):</p>
<pre><code>def netaddr_test(ips, netsets):
for ip in ips:
for subnet, subinfo in netsets.iteritems():
if ip >= subinfo['start'] and ip < subinfo['end']:
print ip, '\t', subinfo.name
break
</code></pre>