Skip to content

Commit

Permalink
GH-103548: Improve performance of pathlib.Path.[is_]absolute() (GH-…
Browse files Browse the repository at this point in the history
…103549)

Improve performance of `pathlib.Path.absolute()` and `cwd()` by joining paths only when necessary. Also improve
performance of `PurePath.is_absolute()` on Posix by skipping path parsing and normalization.
  • Loading branch information
barneygale committed May 6, 2023
1 parent 376137f commit de7f694
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
11 changes: 10 additions & 1 deletion Lib/pathlib.py
Expand Up @@ -664,7 +664,7 @@ def is_absolute(self):
# ntpath.isabs() is defective - see GH-44626 .
if self._flavour is ntpath:
return bool(self.drive and self.root)
return self._flavour.isabs(self)
return self._flavour.isabs(self._raw_path)

def is_reserved(self):
"""Return True if the path contains one of the special names reserved
Expand Down Expand Up @@ -873,6 +873,15 @@ def absolute(self):
cwd = self._flavour.abspath(self.drive)
else:
cwd = os.getcwd()
# Fast path for "empty" paths, e.g. Path("."), Path("") or Path().
# We pass only one argument to with_segments() to avoid the cost
# of joining, and we exploit the fact that getcwd() returns a
# fully-normalized string by storing it in _str. This is used to
# implement Path.cwd().
if not self.root and not self._tail:
result = self.with_segments(cwd)
result._str = cwd
return result
return self.with_segments(cwd, self)

def resolve(self, strict=False):
Expand Down
@@ -0,0 +1,4 @@
Improve performance of :meth:`pathlib.Path.absolute` and
:meth:`~pathlib.Path.cwd` by joining paths only when necessary. Also improve
performance of :meth:`pathlib.PurePath.is_absolute` on Posix by skipping path
parsing and normalization.

0 comments on commit de7f694

Please sign in to comment.