Skip to content

Commit 9b18b6b

Browse files
committed
PERF: Avoid np.divmod in RangeIndex._shallow_copy
1 parent d8eb201 commit 9b18b6b

File tree

2 files changed

+8
-11
lines changed

2 files changed

+8
-11
lines changed

pandas/_libs/lib.pyx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -659,20 +659,20 @@ ctypedef fused int6432_t:
659659

660660
@cython.wraparound(False)
661661
@cython.boundscheck(False)
662-
def is_range_indexer(ndarray[int6432_t, ndim=1] left, Py_ssize_t n) -> bool:
662+
def is_range_indexer(ndarray[int6432_t, ndim=1] left, Py_ssize_t n, int diff=1) -> bool:
663663
"""
664664
Perform an element by element comparison on 1-d integer arrays, meant for indexer
665665
comparisons
666666
"""
667667
cdef:
668668
Py_ssize_t i
669669

670-
if left.size != n:
670+
if left.size != n or diff == 0:
671671
return False
672672

673673
for i in range(n):
674674

675-
if left[i] != i:
675+
if left[i] != left[0] + i * diff:
676676
return False
677677

678678
return True

pandas/core/indexes/range.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -476,14 +476,11 @@ def _shallow_copy(self, values, name: Hashable = no_default):
476476
# GH 46675 & 43885: If values is equally spaced, return a
477477
# more memory-compact RangeIndex instead of Index with 64-bit dtype
478478
diff = values[1] - values[0]
479-
if not missing.isna(diff) and diff != 0:
480-
maybe_range_indexer, remainder = np.divmod(values - values[0], diff)
481-
if (
482-
lib.is_range_indexer(maybe_range_indexer, len(maybe_range_indexer))
483-
and not remainder.any()
484-
):
485-
new_range = range(values[0], values[-1] + diff, diff)
486-
return type(self)._simple_new(new_range, name=name)
479+
if not missing.isna(diff) and lib.is_range_indexer(
480+
values, len(values), diff
481+
):
482+
new_range = range(values[0], values[-1] + diff, diff)
483+
return type(self)._simple_new(new_range, name=name)
487484
return self._constructor._simple_new(values, name=name)
488485

489486
def _view(self) -> Self:

0 commit comments

Comments
 (0)