summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2010-12-30 20:52:52 +0000
committerLars Wirzenius <liw@liw.fi>2010-12-30 20:52:52 +0000
commitcb09fcc7cd50618dafd68bbc8221327e14d24d8e (patch)
tree642bdf5a1eaa3c8848acbdc570b4618a58a9d316
parent9922fcd103de76b1438edb6a1526b4fc8629dbf6 (diff)
downloadlarch-cb09fcc7cd50618dafd68bbc8221327e14d24d8e.tar.gz
Change NodeCodex.leaf_size and index_size to take separate keys and values lists as arguments.
-rw-r--r--btree/codec.py17
-rw-r--r--btree/codec_tests.py4
-rw-r--r--btree/tree.py4
-rwxr-xr-xcodec-speed2
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 \