From 450ae573bcf3b8b9e910dacf5dcf640cced44b97 Mon Sep 17 00:00:00 2001 From: Alexandre Vassalotti Date: Fri, 12 Jun 2009 21:52:14 +0000 Subject: [PATCH] Make pickling of OrderedDict instances more efficient. --- Lib/collections.py | 10 ++++++---- Lib/test/test_collections.py | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Lib/collections.py b/Lib/collections.py index 1e807af81dc..202b8b2a90a 100644 --- a/Lib/collections.py +++ b/Lib/collections.py @@ -99,14 +99,16 @@ class OrderedDict(dict, MutableMapping): def __reduce__(self): 'Return state information for pickling' - items = [[k, self[k]] for k in self] + dictitems = self.iteritems() tmp = self.__map, self.__root del self.__map, self.__root inst_dict = vars(self).copy() self.__map, self.__root = tmp - if inst_dict: - return (self.__class__, (items,), inst_dict) - return self.__class__, (items,) + # Set the state item to None when the dictionary is empty. This saves + # about 2 opcodes when the object is pickled. + if not inst_dict: + inst_dict = None + return (self.__class__, (), inst_dict, None, dictitems) setdefault = MutableMapping.setdefault update = MutableMapping.update diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 1c498765897..b108f9588c2 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -795,9 +795,9 @@ class TestOrderedDict(unittest.TestCase): # do not save instance dictionary if not needed pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] od = OrderedDict(pairs) - self.assertEqual(len(od.__reduce__()), 2) 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): od = OrderedDict([('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)])