bpo-44246: Entry points performance improvements. (GH-26467)

From importlib_metadata 4.3.1.
This commit is contained in:
Jason R. Coombs 2021-05-31 11:52:29 -04:00 committed by GitHub
parent 142e5c5445
commit 410b70d39d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 1 deletions

View File

@ -493,6 +493,11 @@ class Distribution:
"""Return the 'Name' metadata for the distribution package.""" """Return the 'Name' metadata for the distribution package."""
return self.metadata['Name'] return self.metadata['Name']
@property
def _normalized_name(self):
"""Return a normalized version of the name."""
return Prepared.normalize(self.name)
@property @property
def version(self): def version(self):
"""Return the 'Version' metadata for the distribution package.""" """Return the 'Version' metadata for the distribution package."""
@ -795,6 +800,22 @@ class PathDistribution(Distribution):
def locate_file(self, path): def locate_file(self, path):
return self._path.parent / path return self._path.parent / path
@property
def _normalized_name(self):
"""
Performance optimization: where possible, resolve the
normalized name from the file system path.
"""
stem = os.path.basename(str(self._path))
return self._name_from_stem(stem) or super()._normalized_name
def _name_from_stem(self, stem):
name, ext = os.path.splitext(stem)
if ext not in ('.dist-info', '.egg-info'):
return
name, sep, rest = stem.partition('-')
return name
def distribution(distribution_name): def distribution(distribution_name):
"""Get the ``Distribution`` instance for the named package. """Get the ``Distribution`` instance for the named package.
@ -849,7 +870,8 @@ def entry_points(**params) -> Union[EntryPoints, SelectableGroups]:
:return: EntryPoints or SelectableGroups for all installed packages. :return: EntryPoints or SelectableGroups for all installed packages.
""" """
unique = functools.partial(unique_everseen, key=operator.attrgetter('name')) norm_name = operator.attrgetter('_normalized_name')
unique = functools.partial(unique_everseen, key=norm_name)
eps = itertools.chain.from_iterable( eps = itertools.chain.from_iterable(
dist.entry_points for dist in unique(distributions()) dist.entry_points for dist in unique(distributions())
) )

View File

@ -76,3 +76,7 @@ class TestEgg(TestZip):
for file in files('example'): for file in files('example'):
path = str(file.dist.locate_file(file)) path = str(file.dist.locate_file(file))
assert '.egg/' in path, path assert '.egg/' in path, path
def test_normalized_name(self):
dist = distribution('example')
assert dist._normalized_name == 'example'

View File

@ -0,0 +1,3 @@
In importlib.metadata.entry_points, de-duplication of distributions no
longer requires loading the full metadata for PathDistribution objects,
improving entry point loading performance by ~10x.