Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions benchmarks/version.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ def time_hash(self) -> None:
for v in self.valid_versions:
hash(Version(v))

@add_attributes(pretty_name="Version hash (warm cache)")
def time_hash_warm(self) -> None:
for v in self.version_objects_warm:
hash(v)

@add_attributes(pretty_name="Version __str__")
def time_str(self) -> None:
for version in self.valid_versions:
Expand Down
11 changes: 10 additions & 1 deletion src/packaging/version.py
Original file line number Diff line number Diff line change
Expand Up @@ -551,7 +551,16 @@ def _key(self) -> CmpKey:
# __hash__ must be defined when __eq__ is overridden,
# otherwise Python sets __hash__ to None.
def __hash__(self) -> int:
return hash(self._key)
if self._key_cache is None:
self._key_cache = _cmpkey(
self._epoch,
self._release,
self._pre,
self._post,
self._dev,
self._local,
)
return hash(self._key_cache)

# Override comparison methods to use direct _key_cache access
# This is faster than property access, especially before Python 3.12
Expand Down
Loading