Skip to content

Commit 0f30bea

Browse files
committed
PERF: Improve performance for sorted label input
1 parent 19d5974 commit 0f30bea

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

pandas/core/indexes/multi.py

+13-5
Original file line numberDiff line numberDiff line change
@@ -3047,6 +3047,7 @@ def _update_indexer(idxr, indexer=indexer):
30473047
return indexer
30483048
return idxr & indexer
30493049

3050+
need_sort = False
30503051
for i, k in enumerate(reversed(seq)):
30513052
i = len(seq) - 1 - i # Counting in reverse
30523053

@@ -3059,14 +3060,19 @@ def _update_indexer(idxr, indexer=indexer):
30593060
# a collection of labels to include from this level (these
30603061
# are or'd)
30613062
indexers = None
3063+
# Find out if the list_like label are sorted as the levels or not
3064+
k_codes = np.array(
3065+
[self.levels[i].get_loc(e) for e in k if e in self.levels[i]]
3066+
)
3067+
need_sort = not (k_codes[:-1] < k_codes[1:]).all()
30623068
for x in k:
30633069
try:
30643070
idxrs = _convert_to_indexer(
30653071
self._get_level_indexer(x, level=i, indexer=indexer)
30663072
)
3067-
# We intersect with indexer to make idxrs
3068-
# ordered as previously seen indexes
3069-
if indexer is not None:
3073+
if need_sort and indexer is not None:
3074+
# We intersect with indexer to make idxrs
3075+
# ordered as previously seen indexes
30703076
idxrs = indexer.intersection(idxrs)
30713077

30723078
indexers = (
@@ -3079,8 +3085,10 @@ def _update_indexer(idxr, indexer=indexer):
30793085
continue
30803086

30813087
if indexers is not None:
3082-
# No need to update anymore, as we intersect in main loop
3083-
indexer = indexers
3088+
if need_sort:
3089+
indexer = indexers
3090+
else:
3091+
indexer = _update_indexer(indexers, indexer=indexer)
30843092
else:
30853093
# no matches we are done
30863094
return Int64Index([])._ndarray_values

0 commit comments

Comments
 (0)