summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBarney Gale <barney.gale@gmail.com>2024-04-12 22:02:39 (GMT)
committerGitHub <noreply@github.com>2024-04-12 22:02:39 (GMT)
commit30f0643e36d2c9a5849c76ca0b27b748448d0567 (patch)
tree65cede6194946ae5d5f55815c42b454eeabde038
parent0eb52f5f266d9e0a662f28a4d2dfef8c746cf96e (diff)
downloadcpython-30f0643e36d2c9a5849c76ca0b27b748448d0567.zip
cpython-30f0643e36d2c9a5849c76ca0b27b748448d0567.tar.gz
cpython-30f0643e36d2c9a5849c76ca0b27b748448d0567.tar.bz2
GH-117727: Speed up `pathlib.Path.iterdir()` by using `os.scandir()` (#117728)
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`.
-rw-r--r--Lib/pathlib/__init__.py26
-rw-r--r--Misc/NEWS.d/next/Library/2024-04-10-21-30-37.gh-issue-117727.uAYNVS.rst2
2 files changed, 8 insertions, 20 deletions
diff --git a/Lib/pathlib/__init__.py b/Lib/pathlib/__init__.py
index 746cbcd..66eb08a 100644
--- a/Lib/pathlib/__init__.py
+++ b/Lib/pathlib/__init__.py
@@ -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
index 0000000..3a0b683
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-04-10-21-30-37.gh-issue-117727.uAYNVS.rst
@@ -0,0 +1,2 @@
+Speed up :meth:`pathlib.Path.iterdir` by using :func:`os.scandir`
+internally.