首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速Python IPv6压缩

快速Python IPv6压缩
EN

Stack Overflow用户
提问于 2016-10-09 07:38:30
回答 1查看 521关注 0票数 2

我正在尝试编写一些代码,这些代码可以快速返回一个适当压缩的IPv6地址。我试过..。

代码语言:javascript
复制
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秒)的两倍。

所以我开始创造我自己的..。

代码语言:javascript
复制
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')

它返回:

代码语言:javascript
复制
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。

如你所见,我很接近,但你知道他们怎么说“亲密”.

有人有指点吗?我好像碰到了路障。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-09 11:39:12

只需使用socket函数即可。问题中的第一行代码比字符串操作快近10倍:

代码语言:javascript
复制
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

代码语言:javascript
复制
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 loop
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39941174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档