From 8e899adcd72295a138228056643a78cac6e2de57 Mon Sep 17 00:00:00 2001 From: Deepak Cherian Date: Fri, 7 Apr 2023 16:31:05 -0600 Subject: [PATCH] [skip-ci] Add alignment benchmarks (#7738) * [skip-ci] Add alignment benchmarks * [skip-ci] Add random selection * Apply suggestions from code review Co-authored-by: Illviljan <14371165+Illviljan@users.noreply.github.com> --------- Co-authored-by: Illviljan <14371165+Illviljan@users.noreply.github.com> --- asv_bench/asv.conf.json | 3 +- asv_bench/benchmarks/alignment.py | 54 +++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 asv_bench/benchmarks/alignment.py diff --git a/asv_bench/asv.conf.json b/asv_bench/asv.conf.json index 6f8a306fc43..f8387aca856 100644 --- a/asv_bench/asv.conf.json +++ b/asv_bench/asv.conf.json @@ -68,7 +68,8 @@ "distributed": [""], "flox": [""], "numpy_groupies": [""], - "sparse": [""] + "sparse": [""], + "cftime": [""] }, diff --git a/asv_bench/benchmarks/alignment.py b/asv_bench/benchmarks/alignment.py new file mode 100644 index 00000000000..5a6ee3fa0a6 --- /dev/null +++ b/asv_bench/benchmarks/alignment.py @@ -0,0 +1,54 @@ +import numpy as np + +import xarray as xr + +from . import parameterized, requires_dask + +ntime = 365 * 30 +nx = 50 +ny = 50 + +rng = np.random.default_rng(0) + + +class Align: + def setup(self, *args, **kwargs): + data = rng.standard_normal((ntime, nx, ny)) + self.ds = xr.Dataset( + {"temperature": (("time", "x", "y"), data)}, + coords={ + "time": xr.date_range("2000", periods=ntime), + "x": np.arange(nx), + "y": np.arange(ny), + }, + ) + self.year = self.ds.time.dt.year + self.idx = np.unique(rng.integers(low=0, high=ntime, size=ntime // 2)) + self.year_subset = self.year.isel(time=self.idx) + + @parameterized(["join"], [("outer", "inner", "left", "right", "exact", "override")]) + def time_already_aligned(self, join): + xr.align(self.ds, self.year, join=join) + + @parameterized(["join"], [("outer", "inner", "left", "right")]) + def time_not_aligned(self, join): + xr.align(self.ds, self.year[-100:], join=join) + + @parameterized(["join"], [("outer", "inner", "left", "right")]) + def time_not_aligned_random_integers(self, join): + xr.align(self.ds, self.year_subset, join=join) + + +class AlignCFTime(Align): + def setup(self, *args, **kwargs): + super().setup() + self.ds["time"] = xr.date_range("2000", periods=ntime, calendar="noleap") + self.year = self.ds.time.dt.year + self.year_subset = self.year.isel(time=self.idx) + + +class AlignDask(Align): + def setup(self, *args, **kwargs): + requires_dask() + super().setup() + self.ds = self.ds.chunk({"time": 100})