diff options
author | Lars Wirzenius <liw@liw.fi> | 2015-11-01 17:18:32 +0200 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2015-11-01 17:18:32 +0200 |
commit | 1dac14cdd0c1c87cf99cee6aedc956b1caf92845 (patch) | |
tree | 9e9ddab989f945d35bd57770f73624a34f50b213 | |
parent | 1cacf69c7e969688e5edfc8a418dd8c7e9f6bcbd (diff) | |
download | obnam-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.py | 21 |
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) |