From e078a7ca802226fab7a53c6996b01779335ac31d Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 15 Oct 2011 18:36:22 +0200 Subject: [PATCH 1/2] Improve performance of list_ formatter functions. Make list_re not add a value more than once. --- src/calibre/utils/formatter_functions.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/calibre/utils/formatter_functions.py b/src/calibre/utils/formatter_functions.py index f72e26b19d..27ded23eeb 100644 --- a/src/calibre/utils/formatter_functions.py +++ b/src/calibre/utils/formatter_functions.py @@ -909,12 +909,10 @@ class BuiltinListUnion(BuiltinFormatterFunction): l2 = [l.strip() for l in list2.split(separator) if l.strip()] lcl1 = set([icu_lower(l) for l in l1]) - res = [] - for i in l1: - res.append(i) + res = set(l1) for i in l2: if icu_lower(i) not in lcl1: - res.append(i) + res.add(i) if separator == ',': return ', '.join(res) return separator.join(res) @@ -930,7 +928,7 @@ class BuiltinListDifference(BuiltinFormatterFunction): def evaluate(self, formatter, kwargs, mi, locals, list1, list2, separator): l1 = [l.strip() for l in list1.split(separator) if l.strip()] - l2 = [icu_lower(l.strip()) for l in list2.split(separator) if l.strip()] + l2 = set([icu_lower(l.strip()) for l in list2.split(separator) if l.strip()]) res = [] for i in l1: @@ -951,12 +949,12 @@ class BuiltinListIntersection(BuiltinFormatterFunction): def evaluate(self, formatter, kwargs, mi, locals, list1, list2, separator): l1 = [l.strip() for l in list1.split(separator) if l.strip()] - l2 = [icu_lower(l.strip()) for l in list2.split(separator) if l.strip()] + l2 = set([icu_lower(l.strip()) for l in list2.split(separator) if l.strip()]) - res = [] + res = set() for i in l1: if icu_lower(i) in l2: - res.append(i) + res.add(i) if separator == ',': return ', '.join(res) return separator.join(res) @@ -1007,12 +1005,12 @@ class BuiltinListRe(BuiltinFormatterFunction): def evaluate(self, formatter, kwargs, mi, locals, src_list, separator, search_re, opt_replace): l = [l.strip() for l in src_list.split(separator) if l.strip()] - res = [] + res = set() for item in l: if re.search(search_re, item, flags=re.I) is not None: if opt_replace: item = re.sub(search_re, opt_replace, item) - res.append(item) + res.add(item) if separator == ',': return ', '.join(res) return separator.join(res) From 809ea8c1a7f0a9649b51ce2a27fceb53d7f566de Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 15 Oct 2011 18:52:48 +0200 Subject: [PATCH 2/2] prevent list_re from adding empty items to the set. Permit the replacement to create list items (add commas). --- src/calibre/utils/formatter_functions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/calibre/utils/formatter_functions.py b/src/calibre/utils/formatter_functions.py index 27ded23eeb..38fcbe8a1e 100644 --- a/src/calibre/utils/formatter_functions.py +++ b/src/calibre/utils/formatter_functions.py @@ -1010,7 +1010,8 @@ class BuiltinListRe(BuiltinFormatterFunction): if re.search(search_re, item, flags=re.I) is not None: if opt_replace: item = re.sub(search_re, opt_replace, item) - res.add(item) + for i in [l.strip() for l in item.split(',') if l.strip()]: + res.add(i) if separator == ',': return ', '.join(res) return separator.join(res)