From f6d5a61330a3d0856af6ebe1e7879b739b4420c9 Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Mon, 8 Feb 2021 15:56:35 +0100 Subject: [PATCH 1/2] PERF: special case numpy.dtype in is_extension_array_dtype --- pandas/core/dtypes/common.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pandas/core/dtypes/common.py b/pandas/core/dtypes/common.py index dc6d0784df217..d24cff4ae81bb 100644 --- a/pandas/core/dtypes/common.py +++ b/pandas/core/dtypes/common.py @@ -1526,7 +1526,12 @@ def is_extension_array_dtype(arr_or_dtype) -> bool: False """ dtype = getattr(arr_or_dtype, "dtype", arr_or_dtype) - return isinstance(dtype, ExtensionDtype) or registry.find(dtype) is not None + if isinstance(dtype, ExtensionDtype): + return True + elif isinstance(dtype, np.dtype): + return False + else: + return registry.find(dtype) is not None def is_ea_or_datetimelike_dtype(dtype: Optional[DtypeObj]) -> bool: From 3fa3c19224e0c731e8fb64000eb0db8d3515f36f Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Wed, 10 Feb 2021 14:26:54 +0100 Subject: [PATCH 2/2] add benchmark for is_extension_array_dtype --- asv_bench/benchmarks/dtypes.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/asv_bench/benchmarks/dtypes.py b/asv_bench/benchmarks/dtypes.py index a5ed5c389fee4..3efcf46955e2b 100644 --- a/asv_bench/benchmarks/dtypes.py +++ b/asv_bench/benchmarks/dtypes.py @@ -2,9 +2,10 @@ import numpy as np +import pandas as pd from pandas import DataFrame import pandas._testing as tm -from pandas.api.types import pandas_dtype +from pandas.api.types import is_extension_array_dtype, pandas_dtype from .pandas_vb_common import ( datetime_dtypes, @@ -119,4 +120,16 @@ def time_select_dtype_string_exclude(self, dtype): self.df_string.select_dtypes(exclude=dtype) +class CheckDtypes: + def setup(self): + self.ext_dtype = pd.Int64Dtype() + self.np_dtype = np.dtype("int64") + + def time_is_extension_array_dtype_true(self): + is_extension_array_dtype(self.ext_dtype) + + def time_is_extension_array_dtype_false(self): + is_extension_array_dtype(self.np_dtype) + + from .pandas_vb_common import setup # noqa: F401 isort:skip