From 73a7d0897157490a1f0448762318a691a1d88083 Mon Sep 17 00:00:00 2001 From: correctmost <134317971+correctmost@users.noreply.github.com> Date: Tue, 11 Mar 2025 23:24:32 -0400 Subject: [PATCH] Cache _is_setuptools_namespace results to avoid repetitive I/O _is_setuptools_namespace can end up reading the same files over and over. For example, when running pylint's import-error checks on yt-dlp, ~23,500 redundant open() calls were performed prior to caching. Closes pylint-dev/pylint#9603. --- astroid/interpreter/_import/spec.py | 1 + astroid/manager.py | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/astroid/interpreter/_import/spec.py b/astroid/interpreter/_import/spec.py index 9628f7453..7e51cc10e 100644 --- a/astroid/interpreter/_import/spec.py +++ b/astroid/interpreter/_import/spec.py @@ -367,6 +367,7 @@ def contribute_to_path( ) +@lru_cache(maxsize=1024) def _is_setuptools_namespace(location: pathlib.Path) -> bool: try: with open(location / "__init__.py", "rb") as stream: diff --git a/astroid/manager.py b/astroid/manager.py index e1827ab88..163321b80 100644 --- a/astroid/manager.py +++ b/astroid/manager.py @@ -439,7 +439,10 @@ def clear_cache(self) -> None: # pylint: disable=import-outside-toplevel from astroid.brain.helpers import register_all_brains from astroid.inference_tip import clear_inference_tip_cache - from astroid.interpreter._import.spec import _find_spec + from astroid.interpreter._import.spec import ( + _find_spec, + _is_setuptools_namespace, + ) from astroid.interpreter.objectmodel import ObjectModel from astroid.nodes._base_nodes import LookupMixIn from astroid.nodes.scoped_nodes import ClassDef @@ -462,6 +465,7 @@ def clear_cache(self) -> None: ObjectModel.attributes, ClassDef._metaclass_lookup_attribute, _find_spec, + _is_setuptools_namespace, ): lru_cache.cache_clear() # type: ignore[attr-defined]