Skip to content

Commit 716beb1

Browse files
authored
perf: 10% faster stripping zeros (#1058)
* perf: try simpler zeros Signed-off-by: Henry Schreiner <[email protected]> * perf: use int, smaller diff Signed-off-by: Henry Schreiner <[email protected]> * perf: avoid slice if nothing changes Signed-off-by: Henry Schreiner <[email protected]> --------- Signed-off-by: Henry Schreiner <[email protected]>
1 parent 350a230 commit 716beb1

1 file changed

Lines changed: 9 additions & 15 deletions

File tree

src/packaging/version.py

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -622,12 +622,13 @@ def release(self) -> tuple[int, ...]:
622622
>>> _TrimmedRelease('0.0').release
623623
(0,)
624624
"""
625-
# Unlike _strip_trailing_zeros, this leaves one 0.
625+
# This leaves one 0.
626626
rel = super().release
627-
i = len(rel)
627+
len_release = len(rel)
628+
i = len_release
628629
while i > 1 and rel[i - 1] == 0:
629630
i -= 1
630-
return rel[:i]
631+
return rel if i == len_release else rel[:i]
631632

632633

633634
def _parse_letter_version(
@@ -669,17 +670,6 @@ def _parse_local_version(local: str | None) -> LocalType | None:
669670
return None
670671

671672

672-
def _strip_trailing_zeros(release: tuple[int, ...]) -> tuple[int, ...]:
673-
# We want to strip trailing zeros from a tuple of values. This starts
674-
# from the end and returns as soon as it finds a non-zero value. When
675-
# reading a lot of versions, this is a fairly hot function, so not using
676-
# enumerate/reversed, which is slightly slower.
677-
for i in range(len(release) - 1, -1, -1):
678-
if release[i] != 0:
679-
return release[: i + 1]
680-
return ()
681-
682-
683673
def _cmpkey(
684674
epoch: int,
685675
release: tuple[int, ...],
@@ -690,7 +680,11 @@ def _cmpkey(
690680
) -> CmpKey:
691681
# When we compare a release version, we want to compare it with all of the
692682
# trailing zeros removed. We will use this for our sorting key.
693-
_release = _strip_trailing_zeros(release)
683+
len_release = len(release)
684+
i = len_release
685+
while i and release[i - 1] == 0:
686+
i -= 1
687+
_release = release if i == len_release else release[:i]
694688

695689
# We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0.
696690
# We'll do this by abusing the pre segment, but we _only_ want to do this

0 commit comments

Comments
 (0)