Skip to content

Commit 959e3a6

Browse files
perf: accelerate dict2buf
1 parent f6560dc commit 959e3a6

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

mapbuffer/mapbuffer.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -288,10 +288,13 @@ def dict2buf(self, data, compress=None, tobytesfn=None):
288288
noop = lambda x: x
289289
tobytesfn = nvl(tobytesfn, self.tobytesfn, noop)
290290

291-
bytes_data = {
292-
label: compression.compress(tobytesfn(val), method=compress)
293-
for label, val in data.items()
294-
}
291+
if tobytesfn == noop and compress is None:
292+
bytes_data = data
293+
else:
294+
bytes_data = {
295+
label: compression.compress(tobytesfn(val), method=compress)
296+
for label, val in data.items()
297+
}
295298

296299
if self.compute_crc:
297300
for label in bytes_data:
@@ -300,9 +303,17 @@ def dict2buf(self, data, compress=None, tobytesfn=None):
300303
data_region = b"".join(
301304
( bytes_data[label] for label in labels )
302305
)
303-
index[1] = HEADER_LENGTH + index_length * 8
304-
for i, label in zip(range(1, len(labels)), labels):
305-
index[i*2 + 1] = index[(i-1)*2 + 1] + len(bytes_data[labels[i-1]])
306+
307+
lengths = np.fromiter(
308+
(len(bytes_data[lbl]) for lbl in labels),
309+
count=len(labels),
310+
dtype=np.int64,
311+
)
312+
313+
offsets = np.empty_like(lengths)
314+
offsets[0] = HEADER_LENGTH + index_length * 8
315+
offsets[1:] = offsets[0] + np.cumsum(lengths[:-1])
316+
index[1::2] = offsets
306317

307318
del labels
308319

0 commit comments

Comments
 (0)