summaryrefslogtreecommitdiffstats
path: root/Lib/pathlib.py
diff options
context:
space:
mode:
authorBarney Gale <barney.gale@gmail.com>2023-01-05 22:11:50 (GMT)
committerGitHub <noreply@github.com>2023-01-05 22:11:50 (GMT)
commit7fba99eadb3349a6d49d02f13b1fddf44c674393 (patch)
treea8445e2fdf12cbbe1e427ae2f09b7ba578af1a23 /Lib/pathlib.py
parentaf5149f30b652737ef3b495b303819d985f439b1 (diff)
downloadcpython-7fba99eadb3349a6d49d02f13b1fddf44c674393.zip
cpython-7fba99eadb3349a6d49d02f13b1fddf44c674393.tar.gz
cpython-7fba99eadb3349a6d49d02f13b1fddf44c674393.tar.bz2
gh-100562: improve performance of `pathlib.Path.absolute()` (GH-100563)
Increase performance of the `absolute()` method by calling `os.getcwd()` directly, rather than using the `Path.cwd()` class method. This avoids constructing an extra `Path` object (and the parsing/normalization that comes with it). Decrease performance of the `cwd()` class method by calling the `Path.absolute()` method, rather than using `os.getcwd()` directly. This involves constructing an extra `Path` object. We do this to maintain a longstanding pattern where `os` functions are called from only one place, which allows them to be more readily replaced by users. As `cwd()` is generally called at most once within user programs, it's a good bargain. ```shell # before $ ./python -m timeit -s 'from pathlib import Path; p = Path("foo", "bar")' 'p.absolute()' 50000 loops, best of 5: 9.04 usec per loop # after $ ./python -m timeit -s 'from pathlib import Path; p = Path("foo", "bar")' 'p.absolute()' 50000 loops, best of 5: 5.02 usec per loop ``` Automerge-Triggered-By: GH:AlexWaygood
Diffstat (limited to 'Lib/pathlib.py')
-rw-r--r--Lib/pathlib.py12
1 files changed, 7 insertions, 5 deletions
diff --git a/Lib/pathlib.py b/Lib/pathlib.py
index b959e85..a0678f6 100644
--- a/Lib/pathlib.py
+++ b/Lib/pathlib.py
@@ -748,10 +748,12 @@ class Path(PurePath):
@classmethod
def cwd(cls):
- """Return a new path pointing to the current working directory
- (as returned by os.getcwd()).
- """
- return cls(os.getcwd())
+ """Return a new path pointing to the current working directory."""
+ # We call 'absolute()' rather than using 'os.getcwd()' directly to
+ # enable users to replace the implementation of 'absolute()' in a
+ # subclass and benefit from the new behaviour here. This works because
+ # os.path.abspath('.') == os.getcwd().
+ return cls().absolute()
@classmethod
def home(cls):
@@ -825,7 +827,7 @@ class Path(PurePath):
"""
if self.is_absolute():
return self
- return self._from_parts([self.cwd()] + self._parts)
+ return self._from_parts([os.getcwd()] + self._parts)
def resolve(self, strict=False):
"""