]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-113225: Speed up `pathlib._abc.PathBase.glob()` (#113556)
authorBarney Gale <barney.gale@gmail.com>
Thu, 28 Dec 2023 22:23:01 +0000 (22:23 +0000)
committerGitHub <noreply@github.com>
Thu, 28 Dec 2023 22:23:01 +0000 (22:23 +0000)
`PathBase._scandir()` is implemented using `iterdir()`, so we can use its
results directly, rather than passing them through `_make_child_relpath()`.

Lib/pathlib/__init__.py
Lib/pathlib/_abc.py

index ab87b49d0277f33242bb822c54a62b009917596e..2b4193c400a0998fb7c6678902dc8be1fc5487c7 100644 (file)
@@ -299,6 +299,10 @@ class Path(_abc.PathBase, PurePath):
     def _scandir(self):
         return os.scandir(self)
 
+    def _make_child_entry(self, entry):
+        # Transform an entry yielded from _scandir() into a path object.
+        return self._make_child_relpath(entry.name)
+
     def absolute(self):
         """Return an absolute version of this path
         No normalization or symlink resolution is performed.
index efe56ec565c1625405f9b3a2cf73fd98091c2d74..f75b20a1d5f1e5cda2299d8015dc62f162cecd6a 100644 (file)
@@ -87,9 +87,8 @@ def _select_children(parent_paths, dir_only, follow_symlinks, match):
                             continue
                     except OSError:
                         continue
-                name = entry.name
-                if match(name):
-                    yield parent_path._make_child_relpath(name)
+                if match(entry.name):
+                    yield parent_path._make_child_entry(entry)
 
 
 def _select_recursive(parent_paths, dir_only, follow_symlinks):
@@ -112,12 +111,12 @@ def _select_recursive(parent_paths, dir_only, follow_symlinks):
                 for entry in entries:
                     try:
                         if entry.is_dir(follow_symlinks=follow_symlinks):
-                            paths.append(path._make_child_relpath(entry.name))
+                            paths.append(path._make_child_entry(entry))
                             continue
                     except OSError:
                         pass
                     if not dir_only:
-                        yield path._make_child_relpath(entry.name)
+                        yield path._make_child_entry(entry)
 
 
 def _select_unique(paths):
@@ -788,6 +787,10 @@ class PathBase(PurePathBase):
         from contextlib import nullcontext
         return nullcontext(self.iterdir())
 
+    def _make_child_entry(self, entry):
+        # Transform an entry yielded from _scandir() into a path object.
+        return entry
+
     def _make_child_relpath(self, name):
         path_str = str(self)
         tail = self._tail