Skip to content

Commit 8e899ad

Browse files
dcherianIllviljan
andauthored
[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 <[email protected]> --------- Co-authored-by: Illviljan <[email protected]>
1 parent 551de70 commit 8e899ad

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

asv_bench/asv.conf.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@
6868
"distributed": [""],
6969
"flox": [""],
7070
"numpy_groupies": [""],
71-
"sparse": [""]
71+
"sparse": [""],
72+
"cftime": [""]
7273
},
7374

7475

asv_bench/benchmarks/alignment.py

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import numpy as np
2+
3+
import xarray as xr
4+
5+
from . import parameterized, requires_dask
6+
7+
ntime = 365 * 30
8+
nx = 50
9+
ny = 50
10+
11+
rng = np.random.default_rng(0)
12+
13+
14+
class Align:
15+
def setup(self, *args, **kwargs):
16+
data = rng.standard_normal((ntime, nx, ny))
17+
self.ds = xr.Dataset(
18+
{"temperature": (("time", "x", "y"), data)},
19+
coords={
20+
"time": xr.date_range("2000", periods=ntime),
21+
"x": np.arange(nx),
22+
"y": np.arange(ny),
23+
},
24+
)
25+
self.year = self.ds.time.dt.year
26+
self.idx = np.unique(rng.integers(low=0, high=ntime, size=ntime // 2))
27+
self.year_subset = self.year.isel(time=self.idx)
28+
29+
@parameterized(["join"], [("outer", "inner", "left", "right", "exact", "override")])
30+
def time_already_aligned(self, join):
31+
xr.align(self.ds, self.year, join=join)
32+
33+
@parameterized(["join"], [("outer", "inner", "left", "right")])
34+
def time_not_aligned(self, join):
35+
xr.align(self.ds, self.year[-100:], join=join)
36+
37+
@parameterized(["join"], [("outer", "inner", "left", "right")])
38+
def time_not_aligned_random_integers(self, join):
39+
xr.align(self.ds, self.year_subset, join=join)
40+
41+
42+
class AlignCFTime(Align):
43+
def setup(self, *args, **kwargs):
44+
super().setup()
45+
self.ds["time"] = xr.date_range("2000", periods=ntime, calendar="noleap")
46+
self.year = self.ds.time.dt.year
47+
self.year_subset = self.year.isel(time=self.idx)
48+
49+
50+
class AlignDask(Align):
51+
def setup(self, *args, **kwargs):
52+
requires_dask()
53+
super().setup()
54+
self.ds = self.ds.chunk({"time": 100})

0 commit comments

Comments
 (0)