From 8b73b1d37e842a64451cba08f83d2ef2009a4203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Randy=20D=C3=B6ring?= <30527984+radoering@users.noreply.github.com> Date: Sun, 14 Jun 2026 10:46:12 +0200 Subject: [PATCH] perf: caching --- src/poetry/mixology/term.py | 13 +++++++++++-- src/poetry/repositories/http_repository.py | 5 +++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/poetry/mixology/term.py b/src/poetry/mixology/term.py index 3123f3e484e..d3309a6c355 100644 --- a/src/poetry/mixology/term.py +++ b/src/poetry/mixology/term.py @@ -8,6 +8,8 @@ if TYPE_CHECKING: + from collections.abc import Callable + from poetry.core.constraints.version import VersionConstraint from poetry.core.packages.dependency import Dependency @@ -23,8 +25,15 @@ class Term: def __init__(self, dependency: Dependency, is_positive: bool) -> None: self._dependency = dependency self._positive = is_positive - self.relation = functools.lru_cache(maxsize=None)(self._relation) - self.intersect = functools.lru_cache(maxsize=None)(self._intersect) + + # The caches are created lazily because most terms never need them. + @functools.cached_property + def relation(self) -> Callable[[Term], str]: + return functools.lru_cache(maxsize=None)(self._relation) + + @functools.cached_property + def intersect(self) -> Callable[[Term], Term | None]: + return functools.lru_cache(maxsize=None)(self._intersect) @property def inverse(self) -> Term: diff --git a/src/poetry/repositories/http_repository.py b/src/poetry/repositories/http_repository.py index fad5d647744..a123db104e3 100644 --- a/src/poetry/repositories/http_repository.py +++ b/src/poetry/repositories/http_repository.py @@ -76,7 +76,8 @@ def __init__( pool_size=pool_size, ) self._authenticator.add_repository(name, url) - self.get_page = functools.lru_cache(maxsize=None)(self._get_page) + self.get_page = functools.cache(self._get_page) + self._find_packages = functools.cache(self._find_packages_uncached) # type: ignore[method-assign] self._lazy_wheel = config.get("solver.lazy-wheel", True) self._max_retries = config.get("requests.max-retries", 0) @@ -178,7 +179,7 @@ def _is_version_too_recent(self, links: Iterable[Link]) -> bool: return True return False - def _find_packages( + def _find_packages_uncached( self, name: NormalizedName, constraint: VersionConstraint ) -> list[Package]: """