From 27ab5390e050ab6e6b2b19aac9eaeff3c3990cb7 Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Tue, 19 May 2020 13:02:16 +0800 Subject: [PATCH 1/3] reduce importing module nums by lazy import --- Lib/test/libregrtest/main.py | 6 +++--- Lib/test/libregrtest/refleak.py | 3 ++- Lib/test/libregrtest/runtest_mp.py | 3 ++- Lib/test/libregrtest/save_env.py | 22 +++++++++++++++++----- Lib/test/libregrtest/setup.py | 12 ++++++------ Lib/test/libregrtest/utils.py | 2 +- 6 files changed, 31 insertions(+), 17 deletions(-) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 95b4856c8bed7d..4844b302efea26 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -1,13 +1,10 @@ import datetime -import faulthandler import locale import os import platform -import random import re import sys import sysconfig -import tempfile import time import unittest from test.libregrtest.cmdline import _parse_args @@ -199,6 +196,7 @@ def parse_args(self, kwargs): self.ns = ns def find_tests(self, tests): + import random self.tests = tests if self.ns.single: @@ -564,6 +562,7 @@ def save_xml_result(self): f.write(s) def set_temp_dir(self): + import tempfile if self.ns.tempdir: self.tmp_dir = self.ns.tempdir @@ -613,6 +612,7 @@ def cleanup(self): support.unlink(name) def main(self, tests=None, **kwargs): + import faulthandler self.parse_args(kwargs) self.set_temp_dir() diff --git a/Lib/test/libregrtest/refleak.py b/Lib/test/libregrtest/refleak.py index 8d221232eb6ce7..70a7de3db5e4a8 100644 --- a/Lib/test/libregrtest/refleak.py +++ b/Lib/test/libregrtest/refleak.py @@ -2,7 +2,6 @@ import re import sys import warnings -from inspect import isabstract from test import support try: from _abc import _get_dump @@ -26,6 +25,7 @@ def dash_R(ns, test_name, test_func): # This code is hackish and inelegant, but it seems to do the job. import copyreg import collections.abc + from inspect import isabstract if not hasattr(sys, 'gettotalrefcount'): raise Exception("Tracking reference leaks requires a debug build " @@ -148,6 +148,7 @@ def check_fd_deltas(deltas): def dash_R_cleanup(fs, ps, pic, zdc, abcs): import copyreg import collections.abc + from inspect import isabstract # Restore some original values. warnings.filters[:] = fs diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index 7a18e45434bb46..df4ae1a4ff2c7e 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -1,5 +1,4 @@ import collections -import faulthandler import json import os import queue @@ -381,6 +380,7 @@ def stop_workers(self): worker.wait_stopped(start_time) def _get_result(self): + import faulthandler if not any(worker.is_alive() for worker in self.workers): # all worker threads are done: consume pending results try: @@ -443,6 +443,7 @@ def _process_result(self, item): return False def run_tests(self): + import faulthandler self.start_workers() self.test_index = 0 diff --git a/Lib/test/libregrtest/save_env.py b/Lib/test/libregrtest/save_env.py index e7c27a698b06a0..f9c7104038d9c6 100644 --- a/Lib/test/libregrtest/save_env.py +++ b/Lib/test/libregrtest/save_env.py @@ -1,18 +1,14 @@ -import asyncio import builtins import locale -import logging import os -import shutil import sys import sysconfig import threading -import urllib.request import warnings from test import support from test.libregrtest.utils import print_warning try: - import _multiprocessing, multiprocessing.process + import multiprocessing.process except ImportError: multiprocessing = None @@ -73,19 +69,25 @@ def __init__(self, testname, verbose=0, quiet=False, *, pgo=False): ) def get_urllib_requests__url_tempfiles(self): + import urllib.request return list(urllib.request._url_tempfiles) + def restore_urllib_requests__url_tempfiles(self, tempfiles): for filename in tempfiles: support.unlink(filename) def get_urllib_requests__opener(self): + import urllib.request return urllib.request._opener + def restore_urllib_requests__opener(self, opener): + import urllib.request urllib.request._opener = opener def get_asyncio_events__event_loop_policy(self): return support.maybe_get_event_loop_policy() def restore_asyncio_events__event_loop_policy(self, policy): + import asyncio asyncio.set_event_loop_policy(policy) def get_sys_argv(self): @@ -163,29 +165,39 @@ def get_shutil_archive_formats(self): # we could call get_archives_formats() but that only returns the # registry keys; we want to check the values too (the functions that # are registered) + import shutil return shutil._ARCHIVE_FORMATS, shutil._ARCHIVE_FORMATS.copy() + def restore_shutil_archive_formats(self, saved): + import shutil shutil._ARCHIVE_FORMATS = saved[0] shutil._ARCHIVE_FORMATS.clear() shutil._ARCHIVE_FORMATS.update(saved[1]) def get_shutil_unpack_formats(self): + import shutil return shutil._UNPACK_FORMATS, shutil._UNPACK_FORMATS.copy() + def restore_shutil_unpack_formats(self, saved): + import shutil shutil._UNPACK_FORMATS = saved[0] shutil._UNPACK_FORMATS.clear() shutil._UNPACK_FORMATS.update(saved[1]) def get_logging__handlers(self): # _handlers is a WeakValueDictionary + import logging return id(logging._handlers), logging._handlers, logging._handlers.copy() + def restore_logging__handlers(self, saved_handlers): # Can't easily revert the logging state pass def get_logging__handlerList(self): # _handlerList is a list of weakrefs to handlers + import logging return id(logging._handlerList), logging._handlerList, logging._handlerList[:] + def restore_logging__handlerList(self, saved_handlerList): # Can't easily revert the logging state pass diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index ce8149677e0b97..b63be1c897c38f 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -1,19 +1,19 @@ import atexit -import faulthandler import os import signal import sys import unittest from test import support -try: - import gc -except ImportError: - gc = None - from test.libregrtest.utils import setup_unraisable_hook def setup_tests(ns): + import faulthandler + try: + import gc + except ImportError: + gc = None + try: stderr_fd = sys.__stderr__.fileno() except (ValueError, AttributeError): diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 0368694b2adcb7..3dcc95ceb199a7 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -1,7 +1,6 @@ import math import os.path import sys -import textwrap from test import support @@ -54,6 +53,7 @@ def printlist(x, width=70, indent=4, file=None): begin each line. """ + import textwrap blanks = ' ' * indent # Print the sorted list: 'x' may be a '--random' list or a set() print(textwrap.fill(' '.join(str(elt) for elt in sorted(x)), width, From 0bc2fbcf9dbaff5100cf46cc183d4dab3391b238 Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Wed, 17 Jun 2020 20:30:41 +0800 Subject: [PATCH 2/3] revert lazy import in basic test function --- Lib/test/libregrtest/main.py | 6 +++--- Lib/test/libregrtest/setup.py | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 4844b302efea26..95b4856c8bed7d 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -1,10 +1,13 @@ import datetime +import faulthandler import locale import os import platform +import random import re import sys import sysconfig +import tempfile import time import unittest from test.libregrtest.cmdline import _parse_args @@ -196,7 +199,6 @@ def parse_args(self, kwargs): self.ns = ns def find_tests(self, tests): - import random self.tests = tests if self.ns.single: @@ -562,7 +564,6 @@ def save_xml_result(self): f.write(s) def set_temp_dir(self): - import tempfile if self.ns.tempdir: self.tmp_dir = self.ns.tempdir @@ -612,7 +613,6 @@ def cleanup(self): support.unlink(name) def main(self, tests=None, **kwargs): - import faulthandler self.parse_args(kwargs) self.set_temp_dir() diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index b63be1c897c38f..ce8149677e0b97 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -1,19 +1,19 @@ import atexit +import faulthandler import os import signal import sys import unittest from test import support +try: + import gc +except ImportError: + gc = None + from test.libregrtest.utils import setup_unraisable_hook def setup_tests(ns): - import faulthandler - try: - import gc - except ImportError: - gc = None - try: stderr_fd = sys.__stderr__.fileno() except (ValueError, AttributeError): From 324ff77632296bfae657c99e694e5fb6a2467241 Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Wed, 17 Jun 2020 20:49:48 +0800 Subject: [PATCH 3/3] cancel lazy import of faulthandler in runtest_mp --- Lib/test/libregrtest/runtest_mp.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index df4ae1a4ff2c7e..7a18e45434bb46 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -1,4 +1,5 @@ import collections +import faulthandler import json import os import queue @@ -380,7 +381,6 @@ def stop_workers(self): worker.wait_stopped(start_time) def _get_result(self): - import faulthandler if not any(worker.is_alive() for worker in self.workers): # all worker threads are done: consume pending results try: @@ -443,7 +443,6 @@ def _process_result(self, item): return False def run_tests(self): - import faulthandler self.start_workers() self.test_index = 0