From 3cf2be27c9e54eaae6737adfb41f1fc86528aa84 Mon Sep 17 00:00:00 2001 From: Michael Vrable Date: Tue, 25 Feb 2014 17:18:30 -0800 Subject: [PATCH] Improve parsing performance. --- python/cumulus/__init__.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/python/cumulus/__init__.py b/python/cumulus/__init__.py index ed641ff..b351658 100644 --- a/python/cumulus/__init__.py +++ b/python/cumulus/__init__.py @@ -473,30 +473,33 @@ def parse(lines, terminate=None): stop reading input lines. """ - dict = {} + result = {} last_key = None + def make_result(result): + return dict((k, "".join(v)) for (k, v) in result.items()) + for l in lines: # Strip off a trailing newline, if present if len(l) > 0 and l[-1] == "\n": l = l[:-1] if terminate is not None and terminate(l): - if len(dict) > 0: yield dict - dict = {} + if len(result) > 0: yield make_result(result) + result = {} last_key = None continue m = re.match(r"^([-\w]+):\s*(.*)$", l) if m: - dict[m.group(1)] = m.group(2) + result[m.group(1)] = [m.group(2)] last_key = m.group(1) elif len(l) > 0 and l[0].isspace() and last_key is not None: - dict[last_key] += l + result[last_key].append(l) else: last_key = None - if len(dict) > 0: yield dict + if len(result) > 0: yield make_result(result) def parse_full(lines): try: -- 2.20.1