我正在尝试编写一些代码,这些代码可以快速返回一个适当压缩的IPv6地址。我试过..。
socket.inet_pton(socket.AF_INET6,socket.inet_PTON(socket.AF_INET6,address))
ipaddress.IPv6Address(address)
IPy.IP(address)...listed处理IPv6压缩的速度从快到慢。第一种是最快的(每65,565个IP地址~3.6秒),第二种是第一种(每65,565个IP地址~8.4秒),最后一种速度几乎是第二个(每65,565个IP地址~14.4秒)的两倍。
所以我开始创造我自己的..。
import re
from ipaddress import IPv6Address
IPaddlist = [
'2001:db8:00:0:0:0:cafe:1111',
'2001:db8::a:1:2:3:4',
'2001:0DB8:AAAA:0000:0000:0000:0000:000C',
'2001:db8::1:0:0:0:4',
'2001:4958:5555::4b3:ffff',
]
for addr in IPaddlist:
address = ":".join('' if i=='0000' else i.lstrip('0') for i in addr.split(':'))
address2 = (re.sub(r'(:)\1+', r'\1\1', address).lower())
print(address2)
print(IPv6Address(addr))
print('\n')它返回:
2001:db8::cafe:1111
2001:db8::cafe:1111
2001:db8::a:1:2:3:4
2001:db8:0:a:1:2:3:4
2001:db8:aaaa::c
2001:db8:aaaa::c
2001:db8::1::4
2001:db8:0:1::4
2001:4958:5555::4b3:ffff
2001:4958:5555::4b3:ffff每个条目的第一行是我的代码,第二行是正确的压缩,使用ipaddress.IPv6Address。
如你所见,我很接近,但你知道他们怎么说“亲密”.
有人有指点吗?我好像碰到了路障。
发布于 2016-10-09 11:39:12
只需使用socket函数即可。问题中的第一行代码比字符串操作快近10倍:
from socket import inet_ntop, inet_pton, AF_INET6
def compact1(addr, inet_ntop=inet_ntop, inet_pton=inet_pton, AF_INET6=AF_INET6):
return inet_ntop(AF_INET6, inet_pton(AF_INET6, addr))
from ipaddress import IPv6Address
def compact2(addr, IPv6Address=IPv6Address):
return IPv6Address(addr)
import re
def compact3(addr, sub=re.sub):
address = ":".join('' if i=='0000' else i.lstrip('0') for i in addr.split(':'))
return sub(r'(:)\1+', r'\1\1', address).lower()现在让我们来看看%timeit
In[9]: ips = [':'.join('{:x}'.format(random.randint(0, 2**16 - 1)) for i in range(8)) for _ in range(65565)]
In[10]: %timeit for ip in ips: compact1(ip)
10 loops, best of 3: 52.9 ms per loop
In[11]: %timeit for ip in ips: compact2(ip)
1 loop, best of 3: 715 ms per loop
In[12]: %timeit for ip in ips: compact3(ip)
1 loop, best of 3: 411 ms per loophttps://stackoverflow.com/questions/39941174
复制相似问题