]> granicus.if.org Git - python/commitdiff
Make pickling of OrderedDict instances more efficient.
authorAlexandre Vassalotti <alexandre@peadrop.com>
Fri, 12 Jun 2009 21:52:14 +0000 (21:52 +0000)
committerAlexandre Vassalotti <alexandre@peadrop.com>
Fri, 12 Jun 2009 21:52:14 +0000 (21:52 +0000)
Lib/collections.py
Lib/test/test_collections.py

index 1e807af81dc5eaa5f39c53fe6339506bdccdb8bc..202b8b2a90a2fd9acb17187769335ff0d94f42d3 100644 (file)
@@ -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
index 1c498765897c2880bed5aca0aeb3056b2889482a..b108f9588c2d7887ab535e7da3ca429cc90b7de5 100644 (file)
@@ -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)])