From befe6350226e757af19e5b69ba75be95a4061185 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Tue, 22 Jun 2021 19:39:38 +0200 Subject: [PATCH] cache parsed Formatter functions --- gallery_dl/util.py | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/gallery_dl/util.py b/gallery_dl/util.py index ebfa1c45..12896e6e 100644 --- a/gallery_dl/util.py +++ b/gallery_dl/util.py @@ -559,6 +559,7 @@ class Formatter(): Replaces all occurrences of with Example: {f:R /_/} -> "f_o_o_b_a_r" (if "f" is "f o o b a r") """ + CACHE = {} CONVERSIONS = { "l": str.lower, "u": str.upper, @@ -575,19 +576,26 @@ class Formatter(): def __init__(self, format_string, default=None): self.default = default - self.result = [] - self.fields = [] + key = (format_string, default) - for literal_text, field_name, format_spec, conversion in \ - _string.formatter_parser(format_string): - if literal_text: - self.result.append(literal_text) - if field_name: - self.fields.append(( - len(self.result), - self._field_access(field_name, format_spec, conversion), - )) - self.result.append("") + try: + self.result, self.fields = self.CACHE[key] + except KeyError: + self.result = [] + self.fields = [] + + for literal_text, field_name, format_spec, conv in \ + _string.formatter_parser(format_string): + if literal_text: + self.result.append(literal_text) + if field_name: + self.fields.append(( + len(self.result), + self._field_access(field_name, format_spec, conv), + )) + self.result.append("") + + self.CACHE[key] = (self.result, self.fields) if len(self.result) == 1: if self.fields: