Skip to content

Commit b5b7be0

Browse files
committed
PERF: Improve performance for sorted label input
1 parent b32bfee commit b5b7be0

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
@@ -3042,6 +3042,7 @@ def _update_indexer(idxr, indexer=indexer):
30423042
return indexer
30433043
return idxr & indexer
30443044

3045+
need_sort = False
30453046
for i, k in enumerate(reversed(seq)):
30463047
i = len(seq) - 1 - i # Counting in reverse
30473048

@@ -3054,14 +3055,19 @@ def _update_indexer(idxr, indexer=indexer):
30543055
# a collection of labels to include from this level (these
30553056
# are or'd)
30563057
indexers = None
3058+
# Find out if the list_like label are sorted as the levels or not
3059+
k_codes = np.array(
3060+
[self.levels[i].get_loc(e) for e in k if e in self.levels[i]]
3061+
)
3062+
need_sort = not (k_codes[:-1] < k_codes[1:]).all()
30573063
for x in k:
30583064
try:
30593065
idxrs = _convert_to_indexer(
30603066
self._get_level_indexer(x, level=i, indexer=indexer)
30613067
)
3062-
# We intersect with indexer to make idxrs
3063-
# ordered as previously seen indexes
3064-
if indexer is not None:
3068+
if need_sort and indexer is not None:
3069+
# We intersect with indexer to make idxrs
3070+
# ordered as previously seen indexes
30653071
idxrs = indexer.intersection(idxrs)
30663072

30673073
indexers = (
@@ -3074,8 +3080,10 @@ def _update_indexer(idxr, indexer=indexer):
30743080
continue
30753081

30763082
if indexers is not None:
3077-
# No need to update anymore, as we intersect in main loop
3078-
indexer = indexers
3083+
if need_sort:
3084+
indexer = indexers
3085+
else:
3086+
indexer = _update_indexer(indexers, indexer=indexer)
30793087
else:
30803088
# no matches we are done
30813089
return Int64Index([])._ndarray_values

0 commit comments

Comments
 (0)