diff --git a/src/pip/_internal/metadata/importlib/_dists.py b/src/pip/_internal/metadata/importlib/_dists.py index 26370facf..185f6b00c 100644 --- a/src/pip/_internal/metadata/importlib/_dists.py +++ b/src/pip/_internal/metadata/importlib/_dists.py @@ -102,6 +102,7 @@ class Distribution(BaseDistribution): self._dist = dist self._info_location = info_location self._installed_location = installed_location + self._cached_canonical_name: Optional[NormalizedName] = None @classmethod def from_directory(cls, directory: str) -> BaseDistribution: @@ -169,8 +170,10 @@ class Distribution(BaseDistribution): @property def canonical_name(self) -> NormalizedName: - name = self._get_dist_name_from_location() or get_dist_name(self._dist) - return canonicalize_name(name) + if self._cached_canonical_name is None: + name = self._get_dist_name_from_location() or get_dist_name(self._dist) + self._cached_canonical_name = canonicalize_name(name) + return self._cached_canonical_name @property def version(self) -> DistributionVersion: diff --git a/src/pip/_vendor/packaging/utils.py b/src/pip/_vendor/packaging/utils.py index a142d36e2..55cbccf14 100644 --- a/src/pip/_vendor/packaging/utils.py +++ b/src/pip/_vendor/packaging/utils.py @@ -7,7 +7,7 @@ import re from typing import FrozenSet, NewType, Tuple, Union, cast from .tags import Tag, parse_tag -from .version import InvalidVersion, Version +from .version import parse_version, InvalidVersion, Version BuildTag = Union[Tuple[()], Tuple[int, str]] NormalizedName = NewType("NormalizedName", str) @@ -30,6 +30,7 @@ _canonicalize_regex = re.compile(r"[-_.]+") _build_tag_regex = re.compile(r"(\d+)(.*)") +@functools.lru_cache(maxsize=4096) def canonicalize_name(name: str) -> NormalizedName: # This is taken from PEP 503. value = _canonicalize_regex.sub("-", name).lower() @@ -44,7 +45,7 @@ def canonicalize_version(version: Union[Version, str]) -> str: """ if isinstance(version, str): try: - parsed = Version(version) + parsed = parse_version(version) except InvalidVersion: # Legacy versions cannot be normalized return version