Skip to content

Commit e530066

Browse files
authored
PERF: make RangeIndex iterate over ._range (#35676)
1 parent 7a67592 commit e530066

File tree

3 files changed

+24
-8
lines changed

3 files changed

+24
-8
lines changed

asv_bench/benchmarks/index_object.py

+16-8
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ def time_datetime_difference_disjoint(self):
5757

5858
class Range:
5959
def setup(self):
60-
self.idx_inc = RangeIndex(start=0, stop=10 ** 7, step=3)
61-
self.idx_dec = RangeIndex(start=10 ** 7, stop=-1, step=-3)
60+
self.idx_inc = RangeIndex(start=0, stop=10 ** 6, step=3)
61+
self.idx_dec = RangeIndex(start=10 ** 6, stop=-1, step=-3)
6262

6363
def time_max(self):
6464
self.idx_inc.max()
@@ -73,15 +73,23 @@ def time_min_trivial(self):
7373
self.idx_inc.min()
7474

7575
def time_get_loc_inc(self):
76-
self.idx_inc.get_loc(900000)
76+
self.idx_inc.get_loc(900_000)
7777

7878
def time_get_loc_dec(self):
79-
self.idx_dec.get_loc(100000)
79+
self.idx_dec.get_loc(100_000)
80+
81+
def time_iter_inc(self):
82+
for _ in self.idx_inc:
83+
pass
84+
85+
def time_iter_dec(self):
86+
for _ in self.idx_dec:
87+
pass
8088

8189

8290
class IndexEquals:
8391
def setup(self):
84-
idx_large_fast = RangeIndex(100000)
92+
idx_large_fast = RangeIndex(100_000)
8593
idx_small_slow = date_range(start="1/1/2012", periods=1)
8694
self.mi_large_slow = MultiIndex.from_product([idx_large_fast, idx_small_slow])
8795

@@ -94,7 +102,7 @@ def time_non_object_equals_multiindex(self):
94102
class IndexAppend:
95103
def setup(self):
96104

97-
N = 10000
105+
N = 10_000
98106
self.range_idx = RangeIndex(0, 100)
99107
self.int_idx = self.range_idx.astype(int)
100108
self.obj_idx = self.int_idx.astype(str)
@@ -168,7 +176,7 @@ def time_get_loc_non_unique_sorted(self, dtype):
168176
class Float64IndexMethod:
169177
# GH 13166
170178
def setup(self):
171-
N = 100000
179+
N = 100_000
172180
a = np.arange(N)
173181
self.ind = Float64Index(a * 4.8000000418824129e-08)
174182

@@ -212,7 +220,7 @@ class GC:
212220
params = [1, 2, 5]
213221

214222
def create_use_drop(self):
215-
idx = Index(list(range(1000 * 1000)))
223+
idx = Index(list(range(1_000_000)))
216224
idx._engine
217225

218226
def peakmem_gc_instances(self, N):

pandas/core/indexes/range.py

+4
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,10 @@ def get_indexer(self, target, method=None, limit=None, tolerance=None):
373373
def tolist(self):
374374
return list(self._range)
375375

376+
@doc(Int64Index.__iter__)
377+
def __iter__(self):
378+
yield from self._range
379+
376380
@doc(Int64Index._shallow_copy)
377381
def _shallow_copy(self, values=None, name: Label = no_default):
378382
name = self.name if name is no_default else name

pandas/tests/indexes/ranges/test_range.py

+4
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,10 @@ def test_cache(self):
167167
idx.any()
168168
assert idx._cache == {}
169169

170+
for _ in idx:
171+
pass
172+
assert idx._cache == {}
173+
170174
df = pd.DataFrame({"a": range(10)}, index=idx)
171175

172176
df.loc[50]

0 commit comments

Comments
 (0)