GH-112855: Speed up `pathlib.PurePath` pickling (#112856)

The second item in the tuple returned from `__reduce__()` is a tuple of arguments to supply to path constructor. Previously we returned the `parts` tuple here, which entailed joining, parsing and normalising the path object, and produced a compact pickle representation.

With this patch, we instead return a tuple of paths that were originally given to the path constructor. This makes pickling much faster (at the expense of compactness).

It's worth noting that, in the olden times, pathlib performed this parsing/normalization up-front in every case, and so using `parts` for pickling was almost free. Nowadays pathlib only parses/normalises paths when it's necessary or advantageous to do so (e.g. computing a path parent, or iterating over a directory, respectively).
This commit is contained in:
Barney Gale 2024-04-20 17:46:52 +01:00 committed by GitHub
parent d8f350309d
commit 15fbd53ba9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 3 additions and 3 deletions

View File

@ -169,9 +169,7 @@ class PurePath(_abc.PurePathBase):
return NotImplemented return NotImplemented
def __reduce__(self): def __reduce__(self):
# Using the parts tuple helps share interned path parts return self.__class__, tuple(self._raw_paths)
# when pickling related paths.
return (self.__class__, self.parts)
def __repr__(self): def __repr__(self):
return "{}({!r})".format(self.__class__.__name__, self.as_posix()) return "{}({!r})".format(self.__class__.__name__, self.as_posix())

View File

@ -0,0 +1,2 @@
Speed up pickling of :class:`pathlib.PurePath` objects. Patch by Barney
Gale.