summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2015-11-01 17:18:32 +0200
committerLars Wirzenius <liw@liw.fi>2015-11-01 17:18:32 +0200
commit1dac14cdd0c1c87cf99cee6aedc956b1caf92845 (patch)
tree9e9ddab989f945d35bd57770f73624a34f50b213
parent1cacf69c7e969688e5edfc8a418dd8c7e9f6bcbd (diff)
downloadobnam-1dac14cdd0c1c87cf99cee6aedc956b1caf92845.tar.gz
Serialise dict int values specially
Dir objects are mostly integers. This encodes them specially. ./serialise-speed went from 97/s to 104/s.
-rw-r--r--obnamlib/obj_serialiser.py21
1 files changed, 20 insertions, 1 deletions
diff --git a/obnamlib/obj_serialiser.py b/obnamlib/obj_serialiser.py
index 0eb70b5a..ccc0a722 100644
--- a/obnamlib/obj_serialiser.py
+++ b/obnamlib/obj_serialiser.py
@@ -147,9 +147,14 @@ def _next_object(pos, length):
def _serialise_dict(obj):
keys = obj.keys()
+ int_keys = [key for key in keys if type(obj[key]) in (int, long)]
str_keys = [key for key in keys if type(obj[key]) is str]
- other_keys = [key for key in keys if key not in str_keys]
+ special_keys = set(int_keys).union(set(str_keys))
+ other_keys = [key for key in keys if key not in special_keys]
+
parts = []
+ parts.append(_serialise_str_list(int_keys))
+ parts.append(_serialise_int_list([obj[key] for key in int_keys]))
parts.append(_serialise_str_list(str_keys))
parts.append(_serialise_str_list([obj[key] for key in str_keys]))
parts.append(_serialise_str_list(other_keys))
@@ -164,6 +169,10 @@ def _deserialise_dict(serialised):
result = {}
pos = 0
+ int_keys, pos = _deserialise_str_list(serialised, pos)
+ int_values, pos = _deserialise_int_list(serialised, pos)
+ result.update(zip(int_keys, int_values))
+
str_keys, pos = _deserialise_str_list(serialised, pos)
str_values, pos = _deserialise_str_list(serialised, pos)
result.update(zip(str_keys, str_values))
@@ -194,6 +203,16 @@ def _deserialise_str_list(serialised, pos):
return strings, pos
+def _serialise_int_list(ints):
+ return _serialise_str_list([str(i) for i in ints])
+
+
+def _deserialise_int_list(serialised, pos):
+ strings, pos = _deserialise_str_list(serialised, pos)
+ ints = [int(s) for s in strings]
+ return ints, pos
+
+
def _deserialise_prefix(serialised, pos):
length = _extract_length(serialised, pos)
end = _next_object(pos, length)