Skip to content

Commit 14372a5

Browse files
committed
PERF: Improve performance for sorted label input
1 parent 694c769 commit 14372a5

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

pandas/core/indexes/multi.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2995,6 +2995,7 @@ def _update_indexer(idxr, indexer=indexer):
29952995
return indexer
29962996
return idxr & indexer
29972997

2998+
need_sort = False
29982999
for i, k in enumerate(reversed(seq)):
29993000
i = len(seq) - 1 - i # Counting in reverse
30003001

@@ -3007,14 +3008,19 @@ def _update_indexer(idxr, indexer=indexer):
30073008
# a collection of labels to include from this level (these
30083009
# are or'd)
30093010
indexers = None
3011+
# Find out if the list_like label are sorted as the levels or not
3012+
k_codes = np.array(
3013+
[self.levels[i].get_loc(e) for e in k if e in self.levels[i]]
3014+
)
3015+
need_sort = not (k_codes[:-1] < k_codes[1:]).all()
30103016
for x in k:
30113017
try:
30123018
idxrs = _convert_to_indexer(
30133019
self._get_level_indexer(x, level=i, indexer=indexer)
30143020
)
3015-
# We intersect with indexer to make idxrs
3016-
# ordered as previously seen indexes
3017-
if indexer is not None:
3021+
if need_sort and indexer is not None:
3022+
# We intersect with indexer to make idxrs
3023+
# ordered as previously seen indexes
30183024
idxrs = indexer.intersection(idxrs)
30193025

30203026
indexers = (
@@ -3027,8 +3033,10 @@ def _update_indexer(idxr, indexer=indexer):
30273033
continue
30283034

30293035
if indexers is not None:
3030-
# No need to update anymore, as we intersect in main loop
3031-
indexer = indexers
3036+
if need_sort:
3037+
indexer = indexers
3038+
else:
3039+
indexer = _update_indexer(indexers, indexer=indexer)
30323040
else:
30333041
# no matches we are done
30343042
return Int64Index([])._ndarray_values

0 commit comments

Comments
 (0)