擅长:python、mysql、java
<p>这里有一种基于实现IP地址/网络集的<code>netaddr</code>包的可能性。在</p>
<p>首先,假设A=A1∪A2和B=B1∪B2,那么A∩B=(A1∩B1)∪(A1∩B2)∪(A2∩B1)∪(A2∩B2)。在</p>
<p>因此,您可以将列表分解为多个小集合,并使用上面的方法递增地计算交集。例如:</p>
<pre><code>from netaddr import IPSet
A1 = IPSet(['1.2.3.4','145.2.3.0/24'])
A2 = IPSet(['6.5.0.0/16','3.4.1.0/24'])
B1 = IPSet(['1.5.6.7','10.0.3.0/24'])
B2 = IPSet(['1.2.3.0/24','3.4.0.0/16'])
A1B1 = A1 & B1
A1B2 = A1 & B2
A2B1 = A2 & B1
A2B2 = A2 & B2
A1B1 | A1B2 | A2B1 | A2B2
-> IPSet(['1.2.3.4/32', '3.4.1.0/24'])
</code></pre>
<p>但是考虑到,当使用IPSet时,您不需要列出所有的地址,您可能能够执行交集而不必求助于将列表分解为小集合。在</p>
<hr/>
<p>更新:在一台拥有4GB内存的笔记本电脑上,由5000个随机定义的网络(长度8到24位)组成的两个列表的交集只需几秒钟:</p>
<p>列出两个IP地址列表:</p>
^{pr2}$
<p>使它们相交:</p>
<pre><code>import time
import netaddr
ipset1 = netaddr.IPSet(open('iplist1.txt','r').readlines())
ipset2 = netaddr.IPSet(open('iplist2.txt','r').readlines())
print "Set 1:", len(ipset1), "IP addresses"
print "Set 2:", len(ipset2), "IP addresses"
start = time.time()
ipset = ipset1 & ipset2
print "Elapsed:", time.time() - start
print "Intersection:",len(ipset),"IP addresses"
</code></pre>