Issue #23266: Much faster implementation of ipaddress.collapse_addresses() when there are many non-consecutive addresses.

This commit is contained in:
Antoine Pitrou 2015-01-18 16:22:47 +01:00
parent 82e07b92b3
commit e6f250ed90
3 changed files with 15 additions and 7 deletions

View file

@ -170,16 +170,19 @@ def _find_address_range(addresses):
addresses: a list of IPv#Address objects.
Returns:
A tuple containing the first and last IP addresses in the sequence.
A tuple containing the first and last IP addresses in the sequence,
and the number of distinct IP addresses in the sequence.
"""
first = last = addresses[0]
i = 1
for ip in addresses[1:]:
if ip._ip == last._ip + 1:
last = ip
i += 1
else:
break
return (first, last)
return (first, last, i)
def _count_righthand_zero_bits(number, bits):
@ -346,12 +349,13 @@ def collapse_addresses(addresses):
ip, nets[-1]))
nets.append(ip)
# sort and dedup
ips = sorted(set(ips))
# sort
ips = sorted(ips)
# find consecutive address ranges in the sorted sequence and summarize them
while i < len(ips):
(first, last) = _find_address_range(ips[i:])
i = ips.index(last) + 1
(first, last, items) = _find_address_range(ips[i:])
i = items + i
addrs.extend(summarize_address_range(first, last))
return _collapse_addresses_internal(addrs + nets)