From 113b6511672492a2dc2ce747daec235e16ce93b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B0=D0=B2=D0=B5=D0=BB?= Date: Thu, 9 Jan 2025 14:19:00 +0300 Subject: [PATCH] speed up remove_ips_with_subnets function --- cidr4_merger.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/cidr4_merger.py b/cidr4_merger.py index 62fb9fa..ef7b1b8 100644 --- a/cidr4_merger.py +++ b/cidr4_merger.py @@ -41,14 +41,13 @@ def get_mask(binary: str) -> str: def remove_ips_with_subnets(binaries: Set[str]) -> Set[str]: sorted_binaries = sorted(binaries) - i = 0 - while i < len(sorted_binaries) - 1: - mask = get_mask(sorted_binaries[i]) - if sorted_binaries[i + 1].startswith(mask): - del sorted_binaries[i] - else: - i += 1 - return set(sorted_binaries) + result = set() + for x, y in zip(sorted_binaries, sorted_binaries[1:]): + mask = get_mask(x) + if not y.startswith(mask): + result.add(x) + result.add(sorted_binaries[-1]) + return result def rough_merge_binaries(binaries: List[str], req_len: int) -> List[str]: @@ -104,7 +103,7 @@ def smooth_merge_binaries(binaries: List[str], req_len: int) -> List[str]: def main(): file = "cidr4.txt" - required_len = 20 + required_len = 15 data = get_data(file) bin_ips = list(map(cidr4_to_binary, data)) @@ -172,7 +171,6 @@ if __name__ == "__main__": "1111000", "0101000", } - assert remove_ips_with_subnets(set()) == set() # main() cProfile.run("main()")