From 594ef685f20cac2509256404f68350980fc37648 Mon Sep 17 00:00:00 2001 From: Dhimas Ardinata Date: Sun, 17 May 2026 17:48:00 +0700 Subject: [PATCH 1/2] perf(search): fast path string queries --- src/poetry/repositories/link_sources/base.py | 7 ++++--- src/poetry/repositories/repository.py | 7 ++++--- tests/repositories/test_repository.py | 1 + 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/poetry/repositories/link_sources/base.py b/src/poetry/repositories/link_sources/base.py index 650e09dcda3..8d62074b661 100644 --- a/src/poetry/repositories/link_sources/base.py +++ b/src/poetry/repositories/link_sources/base.py @@ -145,11 +145,12 @@ class SimpleRepositoryRootPage: """ def search(self, query: str | list[str]) -> list[str]: - results: list[str] = [] - tokens = query if isinstance(query, list) else [query] + if isinstance(query, str): + return [name for name in self.package_names if query in name] + results: list[str] = [] for name in self.package_names: - if any(token in name for token in tokens): + if any(token in name for token in query): results.append(name) return results diff --git a/src/poetry/repositories/repository.py b/src/poetry/repositories/repository.py index 8ae12bf6afa..6d59d2fad96 100644 --- a/src/poetry/repositories/repository.py +++ b/src/poetry/repositories/repository.py @@ -74,11 +74,12 @@ def add_package(self, package: Package) -> None: self._packages.append(package) def search(self, query: str | list[str]) -> list[Package]: - results: list[Package] = [] - tokens = query if isinstance(query, list) else [query] + if isinstance(query, str): + return [package for package in self.packages if query in package.name] + results: list[Package] = [] for package in self.packages: - if any(token in package.name for token in tokens): + if any(token in package.name for token in query): results.append(package) return results diff --git a/tests/repositories/test_repository.py b/tests/repositories/test_repository.py index 54628c49fe6..8e9f14837e5 100644 --- a/tests/repositories/test_repository.py +++ b/tests/repositories/test_repository.py @@ -108,4 +108,5 @@ def test_search() -> None: assert repo.search("foo") == [package_foo1, package_foo2, package_foobar] assert repo.search("bar") == [package_foobar] + assert repo.search(["foo", "bar"]) == [package_foo1, package_foo2, package_foobar] assert repo.search("nothing") == [] From 10b6cedc21f89ebe647d6d3dc7c08f3718681347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Randy=20D=C3=B6ring?= <30527984+radoering@users.noreply.github.com> Date: Sun, 24 May 2026 17:00:49 +0200 Subject: [PATCH 2/2] use list comprehension in general case and add comment --- src/poetry/repositories/link_sources/base.py | 12 ++++++------ src/poetry/repositories/repository.py | 14 ++++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/poetry/repositories/link_sources/base.py b/src/poetry/repositories/link_sources/base.py index 8d62074b661..30e1e5a751c 100644 --- a/src/poetry/repositories/link_sources/base.py +++ b/src/poetry/repositories/link_sources/base.py @@ -146,14 +146,14 @@ class SimpleRepositoryRootPage: def search(self, query: str | list[str]) -> list[str]: if isinstance(query, str): + # performance shortcut + # We could also create a list from query and use the more general code below, + # but this is a common case that we can optimize for. return [name for name in self.package_names if query in name] - results: list[str] = [] - for name in self.package_names: - if any(token in name for token in query): - results.append(name) - - return results + return [ + name for name in self.package_names if any(token in name for token in query) + ] @cached_property def package_names(self) -> list[str]: diff --git a/src/poetry/repositories/repository.py b/src/poetry/repositories/repository.py index 6d59d2fad96..c64349a5f6c 100644 --- a/src/poetry/repositories/repository.py +++ b/src/poetry/repositories/repository.py @@ -75,14 +75,16 @@ def add_package(self, package: Package) -> None: def search(self, query: str | list[str]) -> list[Package]: if isinstance(query, str): + # performance shortcut + # We could also create a list from query and use the more general code below, + # but this is a common case that we can optimize for. return [package for package in self.packages if query in package.name] - results: list[Package] = [] - for package in self.packages: - if any(token in package.name for token in query): - results.append(package) - - return results + return [ + package + for package in self.packages + if any(token in package.name for token in query) + ] def _find_packages( self, name: NormalizedName, constraint: VersionConstraint