Rev 4506: Implement LeafNode.items() rather than going directly to .keys. in http://bazaar.launchpad.net/~jameinel/bzr/1.17-btree-faster

John Arbash Meinel john at arbash-meinel.com
Wed Jul 1 23:17:49 BST 2009


At http://bazaar.launchpad.net/~jameinel/bzr/1.17-btree-faster

------------------------------------------------------------
revno: 4506
revision-id: john at arbash-meinel.com-20090701221739-6mw9ibe9kqozg795
parent: john at arbash-meinel.com-20090701221254-5d901cn8py29zdes
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 1.17-btree-faster
timestamp: Wed 2009-07-01 17:17:39 -0500
message:
  Implement LeafNode.items() rather than going directly to .keys.
  
  At this point 'timeit' shows that a partial parse gives 28ms down from 49ms.
  So an approx savings of 2x.
-------------- next part --------------
=== modified file 'bzrlib/_btree_serializer_py.py'
--- a/bzrlib/_btree_serializer_py.py	2009-07-01 20:50:37 +0000
+++ b/bzrlib/_btree_serializer_py.py	2009-07-01 22:17:39 +0000
@@ -31,6 +31,9 @@
     def __len__(self):
         return len(self.keys)
 
+    def items(self):
+        return self.keys.items()
+
     def get(self, key):
         """Get the value, refs or None for a given key."""
         return self.keys.get(key, None)

=== modified file 'bzrlib/_btree_serializer_pyx.pyx'
--- a/bzrlib/_btree_serializer_pyx.pyx	2009-07-01 22:12:54 +0000
+++ b/bzrlib/_btree_serializer_pyx.pyx	2009-07-01 22:17:39 +0000
@@ -437,6 +437,7 @@
         #                               self._ref_list_length))
         # if keys1 != keys:
         #     raise ValueError('%s != %s')
+        print 'bad mojo'
         self._keys = keys
 
     property keys:
@@ -445,6 +446,14 @@
                 self._populate_keys()
             return self._keys
 
+    def items(self):
+        cdef _LeafLineEntry entry
+        items = []
+        for entry in self._lines.itervalues():
+            entry._ensure_refs(self._key_length, self._ref_list_length)
+            PyList_Append(items, (entry.key, (entry.value, entry.refs)))
+        return items
+
     def __len__(self):
         return len(self._lines)
         # return len(self._keys)

=== modified file 'bzrlib/btree_index.py'
--- a/bzrlib/btree_index.py	2009-07-01 20:51:38 +0000
+++ b/bzrlib/btree_index.py	2009-07-01 22:17:39 +0000
@@ -924,10 +924,10 @@
         if self._row_offsets[-1] == 1:
             # There is only the root node, and we read that via key_count()
             if self.node_ref_lists:
-                for key, (value, refs) in sorted(self._root_node.keys.items()):
+                for key, (value, refs) in sorted(self._root_node.items()):
                     yield (self, key, value, refs)
             else:
-                for key, (value, refs) in sorted(self._root_node.keys.items()):
+                for key, (value, refs) in sorted(self._root_node.items()):
                     yield (self, key, value)
             return
         start_of_leaves = self._row_offsets[-2]
@@ -943,11 +943,11 @@
         # for spilling index builds to disk.
         if self.node_ref_lists:
             for _, node in nodes:
-                for key, (value, refs) in sorted(node.keys.items()):
+                for key, (value, refs) in sorted(node.items()):
                     yield (self, key, value, refs)
         else:
             for _, node in nodes:
-                for key, (value, refs) in sorted(node.keys.items()):
+                for key, (value, refs) in sorted(node.items()):
                     yield (self, key, value)
 
     @staticmethod



More information about the bazaar-commits mailing list