From 877eab19408eda5738094a28bdad8a9b6e25ba05 Mon Sep 17 00:00:00 2001 From: Jakub Stasiak Date: Fri, 31 May 2024 00:59:09 +0200 Subject: [PATCH] Speed up IPv4Address.ipv6_mapped (numbers instead of strings) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A random find from my side, I was going through this code when I noticed some unnecessary conversions happening. Nice performance improvement basically for free (numbers from my M1 Pro laptop): In [1]: from ipaddress import IPv4Address, IPv6Address In [2]: v4 = IPv4Address('10.0.0.1') In [3]: IPv6Address(f'::ffff:{v4}') == IPv6Address((0xffff << 32) + v4._ip) Out[3]: True In [4]: %timeit IPv6Address(f'::ffff:{v4}') 3.63 µs ± 12 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each) In [5]: %timeit IPv6Address((0xffff << 32) + v4._ip) 184 ns ± 0.413 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each) --- Lib/ipaddress.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py index 8e4d49c859534d..72512fe569c178 100644 --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -1424,7 +1424,7 @@ def ipv6_mapped(self): The IPv4-mapped IPv6 address per RFC 4291. """ - return IPv6Address(f'::ffff:{self}') + return IPv6Address((0xFFFF << 32) + self._ip) class IPv4Interface(IPv4Address):