Make pickling of OrderedDict instances more efficient.

This commit is contained in:
Alexandre Vassalotti 2009-06-12 21:52:14 +00:00
parent f0c9e46cde
commit 450ae573bc
2 changed files with 8 additions and 6 deletions

View File

@ -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

View File

@ -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)])