Skip to content

Commit 32abae9

Browse files
committed
PERF: fix getitem unique_check / initialization issue
1 parent 708792a commit 32abae9

File tree

3 files changed

+18
-12
lines changed

3 files changed

+18
-12
lines changed

asv_bench/benchmarks/frame_methods.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ def time_iteritems(self):
8585
def time_iteritems_cached(self):
8686
self.g()
8787

88+
def time_iteritems_indexing(self):
89+
df = self.df
90+
for col in df:
91+
df[col]
92+
8893
def time_itertuples(self):
8994
for row in self.df2.itertuples():
9095
pass

doc/source/whatsnew/v0.19.2.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ Performance Improvements
2222
~~~~~~~~~~~~~~~~~~~~~~~~
2323

2424
- Improved performance of ``.replace()`` (:issue:`12745`)
25+
- Performance regression fixed in indexing with getitem (:issue:`14930`)
2526
- Improved performance ``Series`` creation with a datetime index and dictionary data (:issue:`14894`)
2627

2728
.. _whatsnew_0192.enhancements.other:

pandas/index.pyx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,16 @@ cdef class IndexEngine:
8282

8383
cdef:
8484
bint unique, monotonic_inc, monotonic_dec
85-
bint initialized, monotonic_check, unique_check
85+
bint initialized, need_monotonic_check, need_unique_check
8686

8787
def __init__(self, vgetter, n):
8888
self.vgetter = vgetter
8989

9090
self.over_size_threshold = n >= _SIZE_CUTOFF
9191

9292
self.initialized = 0
93-
self.monotonic_check = 0
94-
self.unique_check = 0
93+
self.need_monotonic_check = 1
94+
self.need_unique_check = 1
9595

9696
self.unique = 0
9797
self.monotonic_inc = 0
@@ -216,21 +216,21 @@ cdef class IndexEngine:
216216
if not self.initialized:
217217
self.initialize()
218218

219-
self.unique_check = 1
219+
self.need_unique_check = 0
220220
return self.unique == 1
221221

222222
property is_monotonic_increasing:
223223

224224
def __get__(self):
225-
if not self.monotonic_check:
225+
if self.need_monotonic_check:
226226
self._do_monotonic_check()
227227

228228
return self.monotonic_inc == 1
229229

230230
property is_monotonic_decreasing:
231231

232232
def __get__(self):
233-
if not self.monotonic_check:
233+
if self.need_monotonic_check:
234234
self._do_monotonic_check()
235235

236236
return self.monotonic_dec == 1
@@ -246,13 +246,13 @@ cdef class IndexEngine:
246246
self.monotonic_dec = 0
247247
is_unique = 0
248248

249-
self.monotonic_check = 1
249+
self.need_monotonic_check = 0
250+
self.need_unique_check = 0
250251

251252
# we can only be sure of uniqueness if is_unique=1
252253
if is_unique:
253254
self.initialized = 1
254255
self.unique = 1
255-
self.unique_check = 1
256256

257257
cdef _get_index_values(self):
258258
return self.vgetter()
@@ -269,7 +269,7 @@ cdef class IndexEngine:
269269
cdef inline _ensure_mapping_populated(self):
270270
# need to reset if we have previously
271271
# set the initialized from monotonic checks
272-
if self.unique_check:
272+
if self.need_unique_check:
273273
self.initialized = 0
274274
if not self.initialized:
275275
self.initialize()
@@ -282,14 +282,14 @@ cdef class IndexEngine:
282282

283283
if len(self.mapping) == len(values):
284284
self.unique = 1
285-
285+
self.need_unique_check = 0
286286
self.initialized = 1
287287

288288
def clear_mapping(self):
289289
self.mapping = None
290290
self.initialized = 0
291-
self.monotonic_check = 0
292-
self.unique_check = 0
291+
self.need_monotonic_check = 1
292+
self.need_unique_check = 1
293293

294294
self.unique = 0
295295
self.monotonic_inc = 0

0 commit comments

Comments
 (0)