mirror of
https://github.com/python/cpython.git
synced 2025-07-28 21:55:21 +00:00
GH-112361: Speed up pathlib by removing some temporary objects. (#112362)
Construct only one new list object (using `list.copy()`) when creating a new path object with a modified tail. This slightly speeds up `with_name()` and `with_suffix()`
This commit is contained in:
parent
6b961b8cea
commit
19a1fc1b3d
3 changed files with 14 additions and 22 deletions
|
@ -400,13 +400,14 @@ class PurePath:
|
|||
|
||||
def with_name(self, name):
|
||||
"""Return a new path with the file name changed."""
|
||||
if not self.name:
|
||||
raise ValueError("%r has an empty name" % (self,))
|
||||
m = self.pathmod
|
||||
if not name or m.sep in name or (m.altsep and m.altsep in name) or name == '.':
|
||||
raise ValueError("Invalid name %r" % (name))
|
||||
return self._from_parsed_parts(self.drive, self.root,
|
||||
self._tail[:-1] + [name])
|
||||
raise ValueError(f"Invalid name {name!r}")
|
||||
tail = self._tail.copy()
|
||||
if not tail:
|
||||
raise ValueError(f"{self!r} has an empty name")
|
||||
tail[-1] = name
|
||||
return self._from_parsed_parts(self.drive, self.root, tail)
|
||||
|
||||
def with_stem(self, stem):
|
||||
"""Return a new path with the stem changed."""
|
||||
|
@ -417,21 +418,12 @@ class PurePath:
|
|||
has no suffix, add given suffix. If the given suffix is an empty
|
||||
string, remove the suffix from the path.
|
||||
"""
|
||||
m = self.pathmod
|
||||
if m.sep in suffix or m.altsep and m.altsep in suffix:
|
||||
raise ValueError("Invalid suffix %r" % (suffix,))
|
||||
if suffix and not suffix.startswith('.') or suffix == '.':
|
||||
raise ValueError("Invalid suffix %r" % (suffix))
|
||||
name = self.name
|
||||
if not name:
|
||||
raise ValueError("%r has an empty name" % (self,))
|
||||
old_suffix = self.suffix
|
||||
if not old_suffix:
|
||||
name = name + suffix
|
||||
if not suffix:
|
||||
return self.with_name(self.stem)
|
||||
elif suffix.startswith('.') and len(suffix) > 1:
|
||||
return self.with_name(self.stem + suffix)
|
||||
else:
|
||||
name = name[:-len(old_suffix)] + suffix
|
||||
return self._from_parsed_parts(self.drive, self.root,
|
||||
self._tail[:-1] + [name])
|
||||
raise ValueError(f"Invalid suffix {suffix!r}")
|
||||
|
||||
def relative_to(self, other, /, *_deprecated, walk_up=False):
|
||||
"""Return the relative path to another path identified by the passed
|
||||
|
@ -1029,7 +1021,7 @@ class _PathBase(PurePath):
|
|||
elif not path_pattern._tail:
|
||||
raise ValueError("Unacceptable pattern: {!r}".format(pattern))
|
||||
|
||||
pattern_parts = list(path_pattern._tail)
|
||||
pattern_parts = path_pattern._tail.copy()
|
||||
if pattern[-1] in (self.pathmod.sep, self.pathmod.altsep):
|
||||
# GH-65238: pathlib doesn't preserve trailing slash. Add it back.
|
||||
pattern_parts.append('')
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue