Skip to content

Commit 0d1cde3

Browse files
morottirmmancompradyunsgichard26
authored
Optimise logic for displaying packages at the end of pip install (#12791)
Co-authored-by: rmorotti <[email protected]> Co-authored-by: Pradyun Gedam <[email protected]> Co-authored-by: Richard Si <[email protected]>
1 parent 006026f commit 0d1cde3

File tree

3 files changed

+20
-12
lines changed

3 files changed

+20
-12
lines changed

news/12791.bugfix.rst

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Improve pip install performance. The installed packages printout is
2+
now calculated in linear time instead of quadratic time.

src/pip/_internal/commands/install.py

+16-11
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from optparse import SUPPRESS_HELP, Values
88
from typing import List, Optional
99

10+
from pip._vendor.packaging.utils import canonicalize_name
1011
from pip._vendor.rich import print_json
1112

1213
from pip._internal.cache import WheelCache
@@ -472,25 +473,29 @@ def run(self, options: Values, args: List[str]) -> int:
472473
)
473474
env = get_environment(lib_locations)
474475

476+
# Display a summary of installed packages, with extra care to
477+
# display a package name as it was requested by the user.
475478
installed.sort(key=operator.attrgetter("name"))
476-
items = []
477-
for result in installed:
478-
item = result.name
479-
try:
480-
installed_dist = env.get_distribution(item)
481-
if installed_dist is not None:
482-
item = f"{item}-{installed_dist.version}"
483-
except Exception:
484-
pass
485-
items.append(item)
479+
summary = []
480+
installed_versions = {}
481+
for distribution in env.iter_all_distributions():
482+
installed_versions[distribution.canonical_name] = distribution.version
483+
for package in installed:
484+
display_name = package.name
485+
version = installed_versions.get(canonicalize_name(display_name), None)
486+
if version:
487+
text = f"{display_name}-{version}"
488+
else:
489+
text = display_name
490+
summary.append(text)
486491

487492
if conflicts is not None:
488493
self._warn_about_conflicts(
489494
conflicts,
490495
resolver_variant=self.determine_resolver_variant(options),
491496
)
492497

493-
installed_desc = " ".join(items)
498+
installed_desc = " ".join(summary)
494499
if installed_desc:
495500
write_output(
496501
"Successfully installed %s",

src/pip/_internal/metadata/importlib/_envs.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,10 @@ def _iter_distributions(self) -> Iterator[BaseDistribution]:
181181
yield from finder.find_linked(location)
182182

183183
def get_distribution(self, name: str) -> Optional[BaseDistribution]:
184+
canonical_name = canonicalize_name(name)
184185
matches = (
185186
distribution
186187
for distribution in self.iter_all_distributions()
187-
if distribution.canonical_name == canonicalize_name(name)
188+
if distribution.canonical_name == canonical_name
188189
)
189190
return next(matches, None)

0 commit comments

Comments
 (0)