Skip to content

Commit 49a03f4

Browse files
authored
PERF: MultiIndex.isin (#49577)
* MultiIndex.isin perf * gh ref
1 parent d47e052 commit 49a03f4

File tree

3 files changed

+11
-5
lines changed

3 files changed

+11
-5
lines changed

asv_bench/benchmarks/multiindex_object.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -369,10 +369,14 @@ def setup(self, dtype):
369369
}
370370

371371
self.midx = data[dtype]
372-
self.values = self.midx[:100]
372+
self.values_small = self.midx[:100]
373+
self.values_large = self.midx[100:]
373374

374-
def time_isin(self, dtype):
375-
self.midx.isin(self.values)
375+
def time_isin_small(self, dtype):
376+
self.midx.isin(self.values_small)
377+
378+
def time_isin_large(self, dtype):
379+
self.midx.isin(self.values_large)
376380

377381

378382
from .pandas_vb_common import setup # noqa: F401 isort:skip

doc/source/whatsnew/v2.0.0.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ Performance improvements
468468
- Performance improvement in :meth:`MultiIndex.difference` (:issue:`48606`)
469469
- Performance improvement in :class:`MultiIndex` set operations with sort=None (:issue:`49010`)
470470
- Performance improvement in :meth:`.DataFrameGroupBy.mean`, :meth:`.SeriesGroupBy.mean`, :meth:`.DataFrameGroupBy.var`, and :meth:`.SeriesGroupBy.var` for extension array dtypes (:issue:`37493`)
471-
- Performance improvement in :meth:`MultiIndex.isin` when ``level=None`` (:issue:`48622`)
471+
- Performance improvement in :meth:`MultiIndex.isin` when ``level=None`` (:issue:`48622`, :issue:`49577`)
472472
- Performance improvement in :meth:`Index.union` and :meth:`MultiIndex.union` when index contains duplicates (:issue:`48900`)
473473
- Performance improvement for :meth:`Series.value_counts` with nullable dtype (:issue:`48338`)
474474
- Performance improvement for :class:`Series` constructor passing integer numpy array with nullable dtype (:issue:`48338`)

pandas/core/indexes/multi.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -3729,7 +3729,9 @@ def delete(self, loc) -> MultiIndex:
37293729
@doc(Index.isin)
37303730
def isin(self, values, level=None) -> npt.NDArray[np.bool_]:
37313731
if level is None:
3732-
return MultiIndex.from_tuples(algos.unique(values)).get_indexer(self) != -1
3732+
if not isinstance(values, MultiIndex):
3733+
values = MultiIndex.from_tuples(values)
3734+
return values.unique().get_indexer_for(self) != -1
37333735
else:
37343736
num = self._get_level_number(level)
37353737
levs = self.get_level_values(num)

0 commit comments

Comments
 (0)