]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-117727: Speed up `pathlib.Path.iterdir()` by using `os.scandir()` (#117728)
authorBarney Gale <barney.gale@gmail.com>
Fri, 12 Apr 2024 22:02:39 +0000 (23:02 +0100)
committerGitHub <noreply@github.com>
Fri, 12 Apr 2024 22:02:39 +0000 (22:02 +0000)
Replace use of `os.listdir()` with `os.scandir()`. Forgo setting `_drv`,
`_root` and `_tail_cached`, as these usually aren't needed. Use
`os.DirEntry.path` to set `_str`.

Lib/pathlib/__init__.py
Misc/NEWS.d/next/Library/2024-04-10-21-30-37.gh-issue-117727.uAYNVS.rst [new file with mode: 0644]

index 746cbcd9d83d865487b12dc1bd8ea764006bc020..66eb08a45b1bb3660dce844577b0bfdba06f679d 100644 (file)
@@ -584,26 +584,12 @@ class Path(_abc.PathBase, PurePath):
         The children are yielded in arbitrary order, and the
         special entries '.' and '..' are not included.
         """
-        return (self._make_child_relpath(name) for name in os.listdir(self))
-
-
-    def _make_child_relpath(self, name):
-        if not name:
-            return self
-        path_str = str(self)
-        tail = self._tail
-        if tail:
-            path_str = f'{path_str}{self.parser.sep}{name}'
-        elif path_str != '.':
-            path_str = f'{path_str}{name}'
-        else:
-            path_str = name
-        path = self.with_segments(path_str)
-        path._str = path_str
-        path._drv = self.drive
-        path._root = self.root
-        path._tail_cached = tail + [name]
-        return path
+        root_dir = str(self)
+        with os.scandir(root_dir) as scandir_it:
+            paths = [entry.path for entry in scandir_it]
+        if root_dir == '.':
+            paths = map(self._remove_leading_dot, paths)
+        return map(self._from_parsed_string, paths)
 
     def glob(self, pattern, *, case_sensitive=None, recurse_symlinks=False):
         """Iterate over this subtree and yield all existing files (of any
diff --git a/Misc/NEWS.d/next/Library/2024-04-10-21-30-37.gh-issue-117727.uAYNVS.rst b/Misc/NEWS.d/next/Library/2024-04-10-21-30-37.gh-issue-117727.uAYNVS.rst
new file mode 100644 (file)
index 0000000..3a0b683
--- /dev/null
@@ -0,0 +1,2 @@
+Speed up :meth:`pathlib.Path.iterdir` by using :func:`os.scandir`
+internally.