From 9f49997a18a6431f359fb9c4d9f1ebe48ffd7bf6 Mon Sep 17 00:00:00 2001 From: Brett Langdon Date: Wed, 24 Jun 2020 04:38:11 -0400 Subject: Precompile common regular expressions (#1603) --- CONTRIBUTORS | 1 + docs/changelog/1603.misc.rst | 1 + src/tox/config/__init__.py | 13 +++++++++---- 3 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 docs/changelog/1603.misc.rst diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 80dda65c..76b744e6 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -16,6 +16,7 @@ Barry Warsaw Bartolome Sanchez Salado Benoit Pierre Bernat Gabor +Brett Langdon Bruno Oliveira Carl Meyer Charles Brunet diff --git a/docs/changelog/1603.misc.rst b/docs/changelog/1603.misc.rst new file mode 100644 index 00000000..56ab17c9 --- /dev/null +++ b/docs/changelog/1603.misc.rst @@ -0,0 +1 @@ +Improve config parsing performance by precompiling commonly used regular expressions - by :user:`brettlangdon` diff --git a/src/tox/config/__init__.py b/src/tox/config/__init__.py index 2ac4cf3a..f963733e 100644 --- a/src/tox/config/__init__.py +++ b/src/tox/config/__init__.py @@ -57,6 +57,11 @@ SUICIDE_TIMEOUT = 0.0 INTERRUPT_TIMEOUT = 0.3 TERMINATE_TIMEOUT = 0.2 +_FACTOR_LINE_PATTERN = re.compile(r"^([\w{}\.!,-]+)\:\s+(.+)") +_ENVSTR_SPLIT_PATTERN = re.compile(r"((?:\{[^}]+\})+)|,") +_ENVSTR_EXPAND_PATTERN = re.compile(r"\{([^}]+)\}") +_WHITESPACE_PATTERN = re.compile(r"\s+") + def get_plugin_manager(plugins=()): # initialize plugin manager @@ -1438,12 +1443,12 @@ def _split_factor_expr_all(expr): def _expand_envstr(envstr): # split by commas not in groups - tokens = re.split(r"((?:\{[^}]+\})+)|,", envstr) + tokens = _ENVSTR_SPLIT_PATTERN.split(envstr) envlist = ["".join(g).strip() for k, g in itertools.groupby(tokens, key=bool) if k] def expand(env): - tokens = re.split(r"\{([^}]+)\}", env) - parts = [re.sub(r"\s+", "", token).split(",") for token in tokens] + tokens = _ENVSTR_EXPAND_PATTERN.split(env) + parts = [_WHITESPACE_PATTERN.sub("", token).split(",") for token in tokens] return ["".join(variant) for variant in itertools.product(*parts)] return mapcat(expand, envlist) @@ -1607,7 +1612,7 @@ class SectionReader: def _apply_factors(self, s): def factor_line(line): - m = re.search(r"^([\w{}\.!,-]+)\:\s+(.+)", line) + m = _FACTOR_LINE_PATTERN.search(line) if not m: return line -- cgit v1.2.1