docs: def fast_check_serializable(self, df):
          """
          Convert efficiently the frame's object-columns/object-index/multi-index/multi-column to
          records, by creating a recarray only for the object fields instead for the whole dataframe.
          If we have no object dtypes, we can safely convert only the first row to recarray to test if serializable.
          Previously we'd serialize twice the full dataframe when it included object fields or multi-index/columns.
  
          Parameters
          ----------
          df: `pandas.DataFrame` or `pandas.Series`
  
          Returns
          -------
          `tuple[numpy.core.records.recarray, dict[str, numpy.dtype]`
              If any object dtypes are detected in columns or index will return a dict with field-name -> dtype
               mappings, and empty dict otherwise.
          """
          i_dtype, f_dtypes = df.index.dtype, df.dtypes
          index_has_object = df.index.dtype is NP_OBJECT_DTYPE
          fields_with_object = [f for f in df.columns if f_dtypes[f] is NP_OBJECT_DTYPE]
          if df.empty or (not index_has_object and not fields_with_object):
              arr, _ = self._to_records(df.iloc[:10])  # only first few rows for performance
              return arr, {}
          # If only the Index has Objects, choose a small slice (two columns if possible,
          # to avoid switching from a DataFrame to a Series)
          df_objects_only = df[fields_with_object if fields_with_object else df.columns[:2]]
          # Let any exceptions bubble up from here
          arr, dtype = self._to_records(df_objects_only)
          return arr, {f: dtype[f] for f in dtype.names}