New submission from Александр Балезин: Current check "address in network" is seems a bit odd: int(self.network_address) <= int(other._ip) < int(self.broadcast_address) This patch make this in bit-operation manner. Perfomace test:
import ipaddress import timeit class IPv6Network2(ipaddress.IPv6Network): def __contains__(self, other): # always false if one is v4 and the other is v6. if self._version != other._version: return False # dealing with another network. if isinstance(other, ipaddress._BaseNetwork): return False else: # address return other._ip & self.netmask._ip == self.network_address._ip class IPv4Network2(ipaddress.IPv4Network): def __contains__(self, other): # always false if one is v4 and the other is v6. if self._version != other._version: return False # dealing with another network. if isinstance(other, ipaddress._BaseNetwork): return False # dealing with another address else: # address return other._ip & self.netmask._ip == self.network_address._ip ipv6_test_net = ipaddress.IPv6Network("::/0") ipv6_test_net2 = IPv6Network2("::/0") ipv4_test_net = ipaddress.IPv4Network("0.0.0.0/0") ipv4_test_net2 = IPv4Network2("0.0.0.0/0") dataipv6 = list() dataipv4 = list() for x in range(2000000): dataipv6.append(ipaddress.IPv6Address(x)) dataipv4.append(ipaddress.IPv4Address(x)) def test(): for d in dataipv6: d in ipv6_test_net def test2(): for d in dataipv6: d in ipv6_test_net2 def test3(): for d in dataipv4: d in ipv4_test_net def test4(): for d in dataipv4: d in ipv4_test_net2 t = timeit.Timer("test()", "from __main__ import test") print("ipv6 test origin __contains__", t.timeit(number=1)) t = timeit.Timer("test2()", "from __main__ import test2") print("ipv6 test new __contains__", t.timeit(number=1)) t = timeit.Timer("test3()", "from __main__ import test3") print("ipv4 test origin __contains__", t.timeit(number=1)) t = timeit.Timer("test4()", "from __main__ import test4") print("ipv4 test new __contains__", t.timeit(number=1)) Output: ipv6 test origin __contains__ 4.265904285013676 ipv6 test new __contains__ 1.551749340025708 ipv4 test origin __contains__ 3.689626455074176 ipv4 test new __contains__ 2.0175559649942443 ---------- components: Library (Lib) files: ipaddress_contains.patch keywords: patch messages: 253126 nosy: Александр.Балезин priority: normal severity: normal status: open title: speed up ipaddress __contain__ method type: performance versions: Python 3.5 Added file: http://bugs.python.org/file40801/ipaddress_contains.patch _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue25430> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com