[Python-checkins] cpython: Issue #23103: Reduced the memory consumption of IPv4Address and IPv6Address.

serhiy.storchaka python-checkins at python.org
Sat Mar 7 19:09:13 CET 2015


https://hg.python.org/cpython/rev/88a5c1698ca4
changeset:   94894:88a5c1698ca4
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Sat Mar 07 20:08:34 2015 +0200
summary:
  Issue #23103: Reduced the memory consumption of IPv4Address and IPv6Address.

files:
  Lib/ipaddress.py           |  25 ++++++++++++-------------
  Lib/test/test_ipaddress.py |   7 +++++++
  Misc/NEWS                  |   2 ++
  3 files changed, 21 insertions(+), 13 deletions(-)


diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py
--- a/Lib/ipaddress.py
+++ b/Lib/ipaddress.py
@@ -386,6 +386,8 @@
 
     """The mother class."""
 
+    __slots__ = ()
+
     @property
     def exploded(self):
         """Return the longhand version of the IP address as a string."""
@@ -543,6 +545,8 @@
     used by single IP addresses.
     """
 
+    __slots__ = ()
+
     def __int__(self):
         return self._ip
 
@@ -1051,6 +1055,8 @@
 
     """
 
+    __slots__ = ()
+    _version = 4
     # Equivalent to 255.255.255.255 or 32 bits of 1's.
     _ALL_ONES = (2**IPV4LENGTH) - 1
     _DECIMAL_DIGITS = frozenset('0123456789')
@@ -1063,9 +1069,6 @@
     # when constructed (see _make_netmask()).
     _netmask_cache = {}
 
-    def __init__(self, address):
-        self._version = 4
-
     def _explode_shorthand_ip_string(self):
         return str(self)
 
@@ -1243,6 +1246,8 @@
 
     """Represent and manipulate single IPv4 Addresses."""
 
+    __slots__ = ('_ip', '__weakref__')
+
     def __init__(self, address):
 
         """
@@ -1259,8 +1264,6 @@
             AddressValueError: If ipaddress isn't a valid IPv4 address.
 
         """
-        _BaseV4.__init__(self, address)
-
         # Efficient constructor from integer.
         if isinstance(address, int):
             self._check_int_address(address)
@@ -1485,8 +1488,6 @@
               supplied.
 
         """
-
-        _BaseV4.__init__(self, address)
         _BaseNetwork.__init__(self, address)
 
         # Constructing from a packed address or integer
@@ -1590,6 +1591,8 @@
 
     """
 
+    __slots__ = ()
+    _version = 6
     _ALL_ONES = (2**IPV6LENGTH) - 1
     _HEXTET_COUNT = 8
     _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef')
@@ -1599,9 +1602,6 @@
     # when constructed (see _make_netmask()).
     _netmask_cache = {}
 
-    def __init__(self, address):
-        self._version = 6
-
     @classmethod
     def _make_netmask(cls, arg):
         """Make a (netmask, prefix_len) tuple from the given argument.
@@ -1870,6 +1870,8 @@
 
     """Represent and manipulate single IPv6 Addresses."""
 
+    __slots__ = ('_ip', '__weakref__')
+
     def __init__(self, address):
         """Instantiate a new IPv6 address object.
 
@@ -1887,8 +1889,6 @@
             AddressValueError: If address isn't a valid IPv6 address.
 
         """
-        _BaseV6.__init__(self, address)
-
         # Efficient constructor from integer.
         if isinstance(address, int):
             self._check_int_address(address)
@@ -2180,7 +2180,6 @@
               supplied.
 
         """
-        _BaseV6.__init__(self, address)
         _BaseNetwork.__init__(self, address)
 
         # Efficient constructor from integer or packed address
diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py
--- a/Lib/test/test_ipaddress.py
+++ b/Lib/test/test_ipaddress.py
@@ -11,6 +11,7 @@
 import operator
 import pickle
 import ipaddress
+import weakref
 
 
 class BaseTestCase(unittest.TestCase):
@@ -259,6 +260,9 @@
     def test_pickle(self):
         self.pickle_test('192.0.2.1')
 
+    def test_weakref(self):
+        weakref.ref(self.factory('192.0.2.1'))
+
 
 class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
     factory = ipaddress.IPv6Address
@@ -394,6 +398,9 @@
     def test_pickle(self):
         self.pickle_test('2001:db8::')
 
+    def test_weakref(self):
+        weakref.ref(self.factory('2001:db8::'))
+
 
 class NetmaskTestMixin_v4(CommonTestMixin_v4):
     """Input validation on interfaces and networks is very similar"""
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -17,6 +17,8 @@
 Library
 -------
 
+- Issue #23103: Reduced the memory consumption of IPv4Address and IPv6Address.
+
 - Issue #21793: BaseHTTPRequestHandler again logs response code as numeric,
   not as stringified enum.  Patch by Demian Brecht.
 

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list