Make pickling of OrderedDict instances more efficient.
This commit is contained in:
parent
f0c9e46cde
commit
450ae573bc
|
@ -99,14 +99,16 @@ class OrderedDict(dict, MutableMapping):
|
||||||
|
|
||||||
def __reduce__(self):
|
def __reduce__(self):
|
||||||
'Return state information for pickling'
|
'Return state information for pickling'
|
||||||
items = [[k, self[k]] for k in self]
|
dictitems = self.iteritems()
|
||||||
tmp = self.__map, self.__root
|
tmp = self.__map, self.__root
|
||||||
del self.__map, self.__root
|
del self.__map, self.__root
|
||||||
inst_dict = vars(self).copy()
|
inst_dict = vars(self).copy()
|
||||||
self.__map, self.__root = tmp
|
self.__map, self.__root = tmp
|
||||||
if inst_dict:
|
# Set the state item to None when the dictionary is empty. This saves
|
||||||
return (self.__class__, (items,), inst_dict)
|
# about 2 opcodes when the object is pickled.
|
||||||
return self.__class__, (items,)
|
if not inst_dict:
|
||||||
|
inst_dict = None
|
||||||
|
return (self.__class__, (), inst_dict, None, dictitems)
|
||||||
|
|
||||||
setdefault = MutableMapping.setdefault
|
setdefault = MutableMapping.setdefault
|
||||||
update = MutableMapping.update
|
update = MutableMapping.update
|
||||||
|
|
|
@ -795,9 +795,9 @@ class TestOrderedDict(unittest.TestCase):
|
||||||
# do not save instance dictionary if not needed
|
# do not save instance dictionary if not needed
|
||||||
pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
|
pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
|
||||||
od = OrderedDict(pairs)
|
od = OrderedDict(pairs)
|
||||||
self.assertEqual(len(od.__reduce__()), 2)
|
|
||||||
od.x = 10
|
od.x = 10
|
||||||
self.assertEqual(len(od.__reduce__()), 3)
|
self.assertGreaterEqual(len(od.__reduce__()), 2)
|
||||||
|
self.assertLessEqual(len(od.__reduce__()), 5)
|
||||||
|
|
||||||
def test_repr(self):
|
def test_repr(self):
|
||||||
od = OrderedDict([('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)])
|
od = OrderedDict([('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)])
|
||||||
|
|
Loading…
Reference in New Issue