Commit 35c87f2b authored by Raymond Hettinger's avatar Raymond Hettinger

Issue 9865: add __sizeof__ to OrderedDict.

parent 234f88dc
......@@ -97,17 +97,6 @@ class OrderedDict(dict, MutableMapping):
yield curr.key
curr = curr.prev
def __reduce__(self):
'Return state information for pickling'
items = [[k, self[k]] for k in self]
tmp = self.__map, self.__root, self.__hardroot
del self.__map, self.__root, self.__hardroot
inst_dict = vars(self).copy()
self.__map, self.__root, self.__hardroot = tmp
if inst_dict:
return (self.__class__, (items,), inst_dict)
return self.__class__, (items,)
def clear(self):
'od.clear() -> None. Remove all items from od.'
root = self.__root
......@@ -162,6 +151,26 @@ class OrderedDict(dict, MutableMapping):
link.next = first
root.next = first.prev = link
def __reduce__(self):
'Return state information for pickling'
items = [[k, self[k]] for k in self]
tmp = self.__map, self.__root, self.__hardroot
del self.__map, self.__root, self.__hardroot
inst_dict = vars(self).copy()
self.__map, self.__root, self.__hardroot = tmp
if inst_dict:
return (self.__class__, (items,), inst_dict)
return self.__class__, (items,)
def __sizeof__(self):
sizeof = _sys.getsizeof
n = len(self) + 1 # number of links including root
size = sizeof(self.__dict__) # instance dictionary
size += sizeof(self.__map) * 2 # internal dict and inherited dict
size += sizeof(self.__hardroot) * n # link objects
size += sizeof(self.__root) * n # proxy objects
return size
setdefault = MutableMapping.setdefault
update = MutableMapping.update
pop = MutableMapping.pop
......
......@@ -994,6 +994,12 @@ class TestOrderedDict(unittest.TestCase):
with self.assertRaises(KeyError):
od.move_to_end('x')
def test_sizeof(self):
# Wimpy test: Just verify the reported size is larger than a regular dict
d = dict(a=1)
od = OrderedDict(**d)
self.assertGreater(sys.getsizeof(od), sys.getsizeof(d))
class GeneralMappingTests(mapping_tests.BasicTestMappingProtocol):
type2test = OrderedDict
......
......@@ -52,6 +52,8 @@ Core and Builtins
Library
-------
- Issue #9865: collections.OrderedDict now has a __sizeof__ method.
- Issue #9854: The default read() implementation in io.RawIOBase now
handles non-blocking readinto() returning None correctly.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment