id,node_id,number,title,user,state,locked,assignee,milestone,comments,created_at,updated_at,closed_at,author_association,active_lock_reason,draft,pull_request,body,reactions,performed_via_github_app,state_reason,repo,type 1495605827,I_kwDOAMm_X85ZJSJD,7376,groupby+map performance regression on MultiIndex dataset,1419010,closed,0,,,11,2022-12-14T03:56:06Z,2023-08-22T14:47:13Z,2023-08-22T14:47:13Z,NONE,,,,"### What happened? We have upgraded to 2022.12.0 version, and noticed a significant performance regression (orders of magnitude) in a code that involves a groupby+map. This seems to be the issue since the 2022.6.0 release, which I understand had a number of changes (including to the groupby code paths) ([release notes](https://docs.xarray.dev/en/stable/whats-new.html#v2022-06-0-july-21-2022)). ### What did you expect to happen? Fix the performance regression. ### Minimal Complete Verifiable Example ```Python import contextlib import os import time from collections.abc import Iterator import numpy as np import pandas as pd import xarray as xr @contextlib.contextmanager def log_time(label: str) -> Iterator[None]: """"""Logs execution time of the context block"""""" t_0 = time.time() yield print(f""{label} took {time.time() - t_0} seconds"") def main() -> None: m = 100_000 with log_time(""creating df""): df = pd.DataFrame( { ""i1"": [1] * m + [2] * m + [3] * m + [4] * m, ""i2"": list(range(m)) * 4, ""d3"": np.random.randint(0, 2, 4 * m).astype(bool), } ) ds = df.to_xarray().set_coords([""i1"", ""i2""]).set_index(index=[""i1"", ""i2""]) with log_time(""groupby""): def per_grp(da: xr.DataArray) -> xr.DataArray: return da (ds.assign(x=lambda ds: ds[""d3""].groupby(""i1"").map(per_grp))) if __name__ == ""__main__"": main() ``` ### MVCE confirmation - [x] Minimal example — the example is as focused as reasonably possible to demonstrate the underlying issue in xarray. - [x] Complete example — the example is self-contained, including all data and the text of any traceback. - [X] Verifiable example — the example copy & pastes into an IPython prompt or [Binder notebook](https://mybinder.org/v2/gh/pydata/xarray/main?urlpath=lab/tree/doc/examples/blank_template.ipynb), returning the result. - [x] New issue — a search of GitHub Issues suggests this is not a duplicate. ### Relevant log output ```Python xarray current main `2022.12.1.dev7+g021c73e1`, but affects all version since 2022.6.0 (inclusive). > creating df took 0.10657930374145508 seconds > groupby took 129.5521149635315 seconds
xarray 2022.3.0: > creating df took 0.09968900680541992 seconds > groupby took 0.19161295890808105 seconds ``` ### Anything else we need to know? _No response_ ### Environment Environment of the version installed from source (`2022.12.1.dev7+g021c73e1`):
INSTALLED VERSIONS ------------------ commit: None python: 3.10.8 | packaged by conda-forge | (main, Nov 22 2022, 08:25:29) [Clang 14.0.6 ] python-bits: 64 OS: Darwin OS-release: 22.1.0 machine: arm64 processor: arm byteorder: little LC_ALL: None LANG: en_US.UTF-8 LOCALE: ('en_US', 'UTF-8') libhdf5: None libnetcdf: None xarray: 2022.12.1.dev7+g021c73e1 pandas: 1.5.2 numpy: 1.23.5 scipy: None netCDF4: None pydap: None h5netcdf: None h5py: None Nio: None zarr: None cftime: None nc_time_axis: None PseudoNetCDF: None rasterio: None cfgrib: None iris: None bottleneck: None dask: None distributed: None matplotlib: None cartopy: None seaborn: None numbagg: None fsspec: None cupy: None pint: None sparse: None flox: None numpy_groupies: None setuptools: 65.5.1 pip: 22.3.1 conda: None pytest: None mypy: None IPython: None sphinx: None
","{""url"": ""https://api.github.com/repos/pydata/xarray/issues/7376/reactions"", ""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,completed,13221727,issue 753374426,MDU6SXNzdWU3NTMzNzQ0MjY=,4623,Allow chunk spec per variable,1419010,open,0,,,3,2020-11-30T10:56:39Z,2020-12-19T17:17:23Z,,NONE,,,,"Say, I have a zarr dataset with multiple variables `Foo`, `Bar` and `Baz` (and potentially, many more), there are 2 dimensions: `x`, `y` (potentially more). Say both `Foo` and `Bar` are large 2d arrays dims: `x, y`, `Baz` is relatively small 1d array dim: `y`. Say I would like to read that dataset with xarray but increase chunk from the native zarr chunk size for `x` and `y` but only for `Foo` and `Bar`, I would like to keep native chunking for ` Baz`. afaiu currently I would do that with `chunks` parameter to `open_dataset`/`open_zarr`, but if I do do that via say `dict(x=N, y=M)` that will change chunking for all variables that use those dimensions, which isn't exactly what I need, I need those changed only for `Foo` and `Bar`. Is there a way to do that? Should that be part of the ""harmonisation""? One could imagine that xarray could accept a dict of dict akin to `{var: {dim: chunk_spec}}` to specify chunking for specific variables. Note that `rechunk` after reading is not what I want, I would like to specify chunking at read op. _Originally posted by @ravwojdyla in https://github.com/pydata/xarray/issues/4496#issuecomment-732486436_","{""url"": ""https://api.github.com/repos/pydata/xarray/issues/4623/reactions"", ""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,,13221727,issue