From 59e0ca3d7a35e60bdd769cfd97678b801b9472a4 Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Sun, 24 Dec 2023 12:53:52 +0200 Subject: [PATCH] Defer loading of importtlib.metadata This package is needed for `load_setuptools_entrypoints`, but it is quite slow to import. While most users do use `load_setuptools_entrypoints`, maybe some don't, so let's let them avoid the cost. For `import pluggy`: Before: 36ms After: 11ms --- src/pluggy/_manager.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/pluggy/_manager.py b/src/pluggy/_manager.py index 84717e6e..a984d1d7 100644 --- a/src/pluggy/_manager.py +++ b/src/pluggy/_manager.py @@ -1,6 +1,5 @@ from __future__ import annotations -import importlib.metadata import inspect import types import warnings @@ -11,6 +10,7 @@ from typing import Iterable from typing import Mapping from typing import Sequence +from typing import TYPE_CHECKING from . import _tracing from ._callers import _multicall @@ -26,6 +26,10 @@ from ._hooks import normalize_hookimpl_opts from ._result import Result +if TYPE_CHECKING: + # importtlib.metadata import is slow, defer it. + import importlib.metadata + _BeforeTrace = Callable[[str, Sequence[HookImpl], Mapping[str, Any]], None] _AfterTrace = Callable[[Result[Any], str, Sequence[HookImpl], Mapping[str, Any]], None] @@ -384,6 +388,8 @@ def load_setuptools_entrypoints(self, group: str, name: str | None = None) -> in :return: The number of plugins loaded by this call. """ + import importlib.metadata + count = 0 for dist in list(importlib.metadata.distributions()): for ep in dist.entry_points: