diff options
author | Lars Wirzenius <liw@liw.fi> | 2010-12-30 20:52:52 +0000 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2010-12-30 20:52:52 +0000 |
commit | cb09fcc7cd50618dafd68bbc8221327e14d24d8e (patch) | |
tree | 642bdf5a1eaa3c8848acbdc570b4618a58a9d316 | |
parent | 9922fcd103de76b1438edb6a1526b4fc8629dbf6 (diff) | |
download | larch-cb09fcc7cd50618dafd68bbc8221327e14d24d8e.tar.gz |
Change NodeCodex.leaf_size and index_size to take separate keys and values lists as arguments.
-rw-r--r-- | btree/codec.py | 17 | ||||
-rw-r--r-- | btree/codec_tests.py | 4 | ||||
-rw-r--r-- | btree/tree.py | 4 | ||||
-rwxr-xr-x | codec-speed | 2 |
4 files changed, 13 insertions, 14 deletions
diff --git a/btree/codec.py b/btree/codec.py index 6978c80..b8476c4 100644 --- a/btree/codec.py +++ b/btree/codec.py @@ -49,10 +49,10 @@ class NodeCodec(object): self.leaf_pair_fixed_size = key_bytes + struct.calcsize('!I') self.index_pair_size = key_bytes + struct.calcsize('!Q') - def leaf_size(self, pairs): + def leaf_size(self, keys, values): '''Return size of a leaf node with the given pairs.''' - return (self.leaf_header.size + len(pairs) * self.leaf_pair_fixed_size + - len(''.join([value for key, value in pairs]))) + return (self.leaf_header.size + len(keys) * self.leaf_pair_fixed_size + + len(''.join([value for value in values]))) def encode_leaf(self, node): '''Encode a leaf node as a byte string.''' @@ -88,9 +88,9 @@ class NodeCodec(object): '''Return number of index pairs that fit in a node of a given size.''' return (node_size - self.index_header.size) / self.index_pair_size - def index_size(self, pairs): - '''Return size of an inex node with the given pairs.''' - return self.index_header.size + self.index_pair_size * len(pairs) + def index_size(self, keys, values): + '''Return size of an index node with the given pairs.''' + return self.index_header.size + self.index_pair_size * len(keys) def encode_index(self, node): '''Encode an index node as a byte string.''' @@ -136,9 +136,8 @@ class NodeCodec(object): def size(self, node): keys = node.keys() values = node.values() - pairs = zip(keys, values) if isinstance(node, btree.LeafNode): - return self.leaf_size(pairs) + return self.leaf_size(keys, values) else: - return self.index_size(pairs) + return self.index_size(keys, values) diff --git a/btree/codec_tests.py b/btree/codec_tests.py index 4d8fdfa..9bc0ccd 100644 --- a/btree/codec_tests.py +++ b/btree/codec_tests.py @@ -27,10 +27,10 @@ class NodeCodecTests(unittest.TestCase): self.codec = btree.NodeCodec(3) def test_returns_reasonable_size_for_empty_leaf(self): - self.assert_(self.codec.leaf_size([]) > 10) + self.assert_(self.codec.leaf_size([], []) > 10) def test_returns_reasonable_size_for_empty_index(self): - self.assert_(self.codec.index_size([]) > 10) + self.assert_(self.codec.index_size([], []) > 10) def test_returns_reasonable_size_for_empty_leaf_generic(self): leaf = btree.LeafNode(0, [], []) diff --git a/btree/tree.py b/btree/tree.py index ba206fd..edac128 100644 --- a/btree/tree.py +++ b/btree/tree.py @@ -101,8 +101,8 @@ class BTree(object): def _leaf_size(self, node): if node.size is None: - pairs = zip(node.keys(), node.values()) # FIXME - node.size = self.node_store.codec.leaf_size(pairs) + node.size = self.node_store.codec.leaf_size(node.keys(), + node.values()) return node.size def lookup(self, key): diff --git a/codec-speed b/codec-speed index fd9ee74..8f9b7bb 100755 --- a/codec-speed +++ b/codec-speed @@ -22,7 +22,7 @@ python -m timeit \ -s 'keys = [k for k, v in pairs]' \ -s 'values = [v for k, v in pairs]' \ -s 'codec = btree.NodeCodec(19)' \ - 'codec.leaf_size(pairs)' + 'codec.leaf_size(keys, values)' echo -n "encode_leaf " python -m timeit \ |