From 8c9cd5a3d466487c54440a47c8c04959e736aae0 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Sat, 12 Oct 2013 00:24:55 +0200 Subject: Issue #19205: Don't import the 're' module in site and sysconfig module to to speed up interpreter start. --- Lib/site.py | 6 +++--- Lib/sysconfig.py | 4 +++- Lib/test/test_site.py | 15 +++++++++++++++ Misc/NEWS | 3 +++ 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Lib/site.py b/Lib/site.py index 4ac2860..d60f15b 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -70,7 +70,6 @@ ImportError exception, it is silently ignored. import sys import os -import re import builtins import _sitebuiltins @@ -436,8 +435,7 @@ def aliasmbcs(): encodings._cache[enc] = encodings._unknown encodings.aliases.aliases[enc] = 'mbcs' - -CONFIG_LINE = re.compile(r'^(?P(\w|[-_])+)\s*=\s*(?P.*)\s*$') +CONFIG_LINE = r'^(?P(\w|[-_])+)\s*=\s*(?P.*)\s*$' def venv(known_paths): global PREFIXES, ENABLE_USER_SITE @@ -460,6 +458,8 @@ def venv(known_paths): ] if candidate_confs: + import re + config_line = re.compile(CONFIG_LINE) virtual_conf = candidate_confs[0] system_site = "true" with open(virtual_conf) as f: diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index ee38a20..efc9a84 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -1,7 +1,6 @@ """Access to Python's configuration information.""" import os -import re import sys from os.path import pardir, realpath @@ -222,6 +221,7 @@ def _parse_makefile(filename, vars=None): """ # Regexes needed for parsing Makefile (and similar syntaxes, # like old-style Setup files). + import re _variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") @@ -435,6 +435,7 @@ def parse_config_h(fp, vars=None): """ if vars is None: vars = {} + import re define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") @@ -658,6 +659,7 @@ def get_platform(): return "%s-%s.%s" % (osname, version, release) elif osname[:6] == "cygwin": osname = "cygwin" + import re rel_re = re.compile(r'[\d.]+') m = rel_re.match(release) if m: diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 575d65b..41fa7b1 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -420,5 +420,20 @@ class ImportSideEffectTests(unittest.TestCase): self.assertEqual(code, 200, msg="Can't find " + url) +class StartupImportTests(unittest.TestCase): + + def test_startup_imports(self): + # This tests checks which modules are loaded by Python when it + # initially starts upon startup. + args = [sys.executable, '-I', '-c', + 'import sys; print(set(sys.modules))'] + stdout = subprocess.check_output(args) + modules = eval(stdout.decode('utf-8')) + self.assertIn('site', modules) + + re_mods = {'re', '_sre', 'sre_compile', 'sre_constants', 'sre_parse'} + self.assertFalse(modules.intersection(re_mods)) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS index 18df7bd..c520bbe 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,9 @@ Core and Builtins Library ------- +- Issue #19205: Don't import the 're' module in site and sysconfig module to + to speed up interpreter start. + - Issue #9548: Add a minimal "_bootlocale" module that is imported by the _io module instead of the full locale module. -- cgit v0.12