Skip to content

Avoid converting chunked data to Numpy arrays (i.e. .values calls) - #1588

Open
cmdupuis3 wants to merge 26 commits into
UXARRAY:mainfrom
cmdupuis3:cmd/devalue
Open

Avoid converting chunked data to Numpy arrays (i.e. .values calls)#1588
cmdupuis3 wants to merge 26 commits into
UXARRAY:mainfrom
cmdupuis3:cmd/devalue

Conversation

@cmdupuis3

@cmdupuis3 cmdupuis3 commented Jul 18, 2026

Copy link
Copy Markdown
Collaborator

Partly addresses #1583

Overview

This PR is to resolve suboptimal usage of .values throughout the repo, primarily by deferring to lazy xarray and dask operations. See the table of usage sites in Issue #1583.

This specific PR is for the first two tables of usage sites; dead code and bugfixes aren't really included here. Aside from simple cases, some cases were solved by branching on whether the data type was already chunked, so scalability for some parts will depend on if you're using numpy or xarray/dask arrays at those points.

PR Checklist

General

  • An issue is linked created and linked
  • Add appropriate labels
  • Filled out Overview and Expected Usage (if applicable) sections

Testing

  • Adequate tests are created if there is new functionality
  • Tests cover all possible logical paths in your function
  • Tests are not too basic (such as simply calling a function and nothing else)

Documentation

  • Docstrings have been added to all new functions
  • Docstrings have updated with any function changes

@cmdupuis3 cmdupuis3 self-assigned this Jul 18, 2026
@cmdupuis3 cmdupuis3 added scalability Related to scalability & performance efforts run-benchmark Run ASV benchmark workflow labels Jul 18, 2026
@github-actions

github-actions Bot commented Jul 18, 2026

Copy link
Copy Markdown

ASV Benchmarking

Benchmark Comparison Results

Benchmarks that have improved:

Change Before [3228024] After [c57c8f1] Ratio Benchmark (Parameter)
- 522M 336M 0.64 face_bounds.FaceBounds.peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
- 631M 336M 0.53 face_bounds.FaceBounds.peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/quad-hexagon/grid.nc'))
- 688±0.9ms 564±3ms 0.82 mpas_ocean.CrossSections.time_const_lat('120km', 1)
- 350±4ms 287±1ms 0.82 mpas_ocean.CrossSections.time_const_lat('120km', 2)
- 179±1ms 147±0.6ms 0.82 mpas_ocean.CrossSections.time_const_lat('120km', 4)
- 436M 331M 0.76 mpas_ocean.FaceAreas.peakmem_compute_face_areas('480km')
- 432M 330M 0.76 mpas_ocean.Gradient.peakmem_gradient('480km')

Benchmarks that have stayed the same:

Change Before [3228024] After [c57c8f1] Ratio Benchmark (Parameter)
201±2ms 199±0.7ms 0.99 bench_connectivity.Connectivity.time_edge_face('120km')
12.0±0.03ms 12.0±0.07ms 1.00 bench_connectivity.Connectivity.time_edge_face('480km')
208±10ms 199±3ms 0.96 bench_connectivity.Connectivity.time_edge_node('120km')
11.0±0.05ms 11.0±0.06ms 1.00 bench_connectivity.Connectivity.time_edge_node('480km')
198±2ms 197±0.4ms 1.00 bench_connectivity.Connectivity.time_face_edge('120km')
11.3±0.05ms 11.9±0.6ms 1.06 bench_connectivity.Connectivity.time_face_edge('480km')
884±7ms 873±5ms 0.99 bench_connectivity.Connectivity.time_face_face('120km')
55.4±1ms 54.5±0.4ms 0.98 bench_connectivity.Connectivity.time_face_face('480km')
66.5±2μs 66.7±2μs 1.00 bench_connectivity.Connectivity.time_face_node('120km')
68.9±3μs 62.5±2μs ~0.91 bench_connectivity.Connectivity.time_face_node('480km')
401±3μs 405±7μs 1.01 bench_connectivity.Connectivity.time_n_nodes_per_face('120km')
343±10μs 343±8μs 1.00 bench_connectivity.Connectivity.time_n_nodes_per_face('480km')
198±0.7ms 200±0.7ms 1.01 bench_connectivity.Connectivity.time_node_edge('120km')
11.4±0.03ms 11.3±0.02ms 1.00 bench_connectivity.Connectivity.time_node_edge('480km')
81.5±4ms 76.7±0.4ms 0.94 bench_connectivity.Connectivity.time_node_face('120km')
5.12±0.04ms 5.10±0.03ms 1.00 bench_connectivity.Connectivity.time_node_face('480km')
334M 334M 1.00 face_bounds.FaceBounds.peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
365M 363M 1.00 face_bounds.FaceBounds.peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
8.72±0.1ms 8.54±0.05ms 0.98 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
2.76±0.03ms 2.68±0.03ms 0.97 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
10.1±0.03ms 10.3±0.07ms 1.01 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
2.03±0.02ms 2.13±0.01ms 1.05 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/quad-hexagon/grid.nc'))
1.23±0.04μs 1.22±0.04μs 1.00 geometry_kernels.AccucrossKernels.time_accucross
2.76±0.05μs 2.74±0.05μs 0.99 geometry_kernels.AccucrossKernels.time_accucross_pair
441±9ns 451±9ns 1.02 geometry_kernels.EFTPrimitives.time_acc_sqrt_re
431±20ns 421±20ns 0.98 geometry_kernels.EFTPrimitives.time_diff_of_products
376±9ns 371±20ns 0.99 geometry_kernels.EFTPrimitives.time_two_prod
386±10ns 386±10ns 1.00 geometry_kernels.EFTPrimitives.time_two_sum
1.65±0.01μs 1.55±0.02μs 0.94 geometry_kernels.GCAConstLatIntersection.time_accux_constlat_kernel
1.13±0.02μs 1.13±0.02μs 1.00 geometry_kernels.GCAConstLatIntersection.time_gca_const_lat_intersection
1.99±0.05μs 1.97±0.05μs 0.99 geometry_kernels.GCAConstLatIntersection.time_try_gca_const_lat_intersection
1.74±0.04μs 1.67±0.04μs 0.96 geometry_kernels.GCAGCAIntersection.time_accux_gca_kernel
1.40±0.02μs 1.39±0.03μs 0.99 geometry_kernels.GCAGCAIntersection.time_gca_gca_intersection
2.16±0.03μs 2.26±0.05μs 1.05 geometry_kernels.GCAGCAIntersection.time_try_gca_gca_intersection
53.8±1μs 50.7±1μs 0.94 geometry_kernels.OrientPredicates.time_on_minor_arc
1.10±0.01μs 1.08±0.02μs 0.99 geometry_kernels.OrientPredicates.time_orient3d_on_sphere
2.71±0.1ms 2.60±0.01ms 0.96 geometry_samebody.SameBodyConstLat.time_accux_dispatch
1.17±0ms 1.17±0ms 1.00 geometry_samebody.SameBodyConstLat.time_accux_kernel
1.73±0.01ms 1.72±0.01ms 1.00 geometry_samebody.SameBodyConstLat.time_fp64_dispatch
149±2μs 147±0.5μs 0.98 geometry_samebody.SameBodyConstLat.time_fp64_kernel
32.3±0.03ms 32.3±0.1ms 1.00 geometry_samebody_gcagca.SameBodyGcaGca.time_accux_dispatch
10.2±0ms 10.4±0.04ms 1.02 geometry_samebody_gcagca.SameBodyGcaGca.time_accux_kernel
26.6±0.09ms 26.4±0.03ms 0.99 geometry_samebody_gcagca.SameBodyGcaGca.time_fp64_dispatch
5.09±0.09ms 4.91±0ms 0.97 geometry_samebody_gcagca.SameBodyGcaGca.time_fp64_kernel
804±7ms 802±3ms 1.00 import.Imports.timeraw_import_uxarray
2.79±0.08ms 2.69±0.04ms 0.96 mpas_ocean.CheckNorm.time_check_norm('120km')
2.24±0.03ms 2.19±0.01ms 0.98 mpas_ocean.CheckNorm.time_check_norm('480km')
814±9ms 808±3ms 0.99 mpas_ocean.ConnectivityConstruction.time_face_face_connectivity('120km')
53.5±1ms 53.4±0.6ms 1.00 mpas_ocean.ConnectivityConstruction.time_face_face_connectivity('480km')
661±7μs 657±6μs 0.99 mpas_ocean.ConnectivityConstruction.time_n_nodes_per_face('120km')
579±10μs 587±10μs 1.01 mpas_ocean.ConnectivityConstruction.time_n_nodes_per_face('480km')
5.34±0.04ms 5.38±0.02ms 1.01 mpas_ocean.ConstructFaceLatLon.time_cartesian_averaging('120km')
3.88±0.03ms 3.85±0.02ms 0.99 mpas_ocean.ConstructFaceLatLon.time_cartesian_averaging('480km')
3.43±0s 3.41±0s 1.00 mpas_ocean.ConstructFaceLatLon.time_welzl('120km')
223±0.7ms 220±1ms 0.99 mpas_ocean.ConstructFaceLatLon.time_welzl('480km')
18.2±0.04ms 18.1±0.02ms 1.00 mpas_ocean.ConstructTreeStructures.time_ball_tree('120km')
1.03±0.01ms 1.03±0.02ms 1.00 mpas_ocean.ConstructTreeStructures.time_ball_tree('480km')
10.6±0.02ms 10.6±0.01ms 1.00 mpas_ocean.ConstructTreeStructures.time_kd_tree('120km')
681±20μs 691±8μs 1.01 mpas_ocean.ConstructTreeStructures.time_kd_tree('480km')
536±3ms 513±5ms 0.96 mpas_ocean.CrossSections.time_const_lat('480km', 1)
270±0.7ms 263±1ms 0.98 mpas_ocean.CrossSections.time_const_lat('480km', 2)
139±0.7ms 134±0.4ms 0.96 mpas_ocean.CrossSections.time_const_lat('480km', 4)
24.2±0.1ms 24.5±0.1ms 1.01 mpas_ocean.DualMesh.time_dual_mesh_construction('120km')
3.22±0.09ms 3.30±0.1ms 1.03 mpas_ocean.DualMesh.time_dual_mesh_construction('480km')
349M 349M 1.00 mpas_ocean.FaceAreas.peakmem_compute_face_areas('120km')
60.2±0.3ms 60.8±0.3ms 1.01 mpas_ocean.FaceAreas.time_compute_face_areas('120km')
7.01±0.1ms 7.03±0.07ms 1.00 mpas_ocean.FaceAreas.time_compute_face_areas('480km')
951±10ms 945±2ms 0.99 mpas_ocean.GeoDataFrame.time_to_geodataframe('120km', False)
54.3±0.6ms 53.7±2ms 0.99 mpas_ocean.GeoDataFrame.time_to_geodataframe('120km', True)
83.6±2ms 82.4±0.4ms 0.99 mpas_ocean.GeoDataFrame.time_to_geodataframe('480km', False)
5.33±0.1ms 5.44±0.06ms 1.02 mpas_ocean.GeoDataFrame.time_to_geodataframe('480km', True)
354M 350M 0.99 mpas_ocean.Gradient.peakmem_gradient('120km')
172±0.1ms 172±0.5ms 1.00 mpas_ocean.Gradient.time_gradient('120km')
12.6±0.2ms 12.5±0.06ms 0.99 mpas_ocean.Gradient.time_gradient('480km')
372±10μs 377±20μs 1.01 mpas_ocean.HoleEdgeIndices.time_construct_hole_edge_indices('120km')
197±10μs 195±5μs 0.99 mpas_ocean.HoleEdgeIndices.time_construct_hole_edge_indices('480km')
350M 350M 1.00 mpas_ocean.Integrate.peakmem_integrate('120km')
329M 329M 1.00 mpas_ocean.Integrate.peakmem_integrate('480km')
522±8μs 557±20μs 1.07 mpas_ocean.Integrate.time_integrate('120km')
181±3ms 180±2ms 0.99 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('120km', 'exclude')
181±3ms 181±1ms 1.00 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('120km', 'include')
181±4ms 181±1ms 1.00 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('120km', 'split')
13.8±0.6ms 13.4±0.04ms 0.97 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('480km', 'exclude')
13.4±0.4ms 13.7±0.3ms 1.03 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('480km', 'include')
13.6±0.3ms 13.3±0.1ms 0.98 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('480km', 'split')
392±10μs 397±8μs 1.01 mpas_ocean.PointInPolygon.time_face_search_lonlat('120km')
401±10μs 383±10μs 0.95 mpas_ocean.PointInPolygon.time_face_search_lonlat('480km')
361±9μs 374±9μs 1.03 mpas_ocean.PointInPolygon.time_face_search_xyz('120km')
351±8μs 373±9μs 1.06 mpas_ocean.PointInPolygon.time_face_search_xyz('480km')
242±3ms 240±0.4ms 0.99 mpas_ocean.RemapDownsample.time_bilinear_remapping
289±8ms 283±3ms 0.98 mpas_ocean.RemapDownsample.time_inverse_distance_weighted_remapping
15.6±0.3ms 15.3±0.1ms 0.98 mpas_ocean.RemapDownsample.time_nearest_neighbor_remapping
1.43±0s 1.41±0s 0.99 mpas_ocean.RemapUpsample.time_bilinear_remapping
36.4±1ms 36.2±0.6ms 0.99 mpas_ocean.RemapUpsample.time_inverse_distance_weighted_remapping
12.5±0.2ms 12.2±0.2ms 0.97 mpas_ocean.RemapUpsample.time_nearest_neighbor_remapping
25.5±0.6ms 25.9±0.1ms 1.01 mpas_ocean.ZonalAverage.time_zonal_average('120km')
5.61±0.05ms 5.71±0.07ms 1.02 mpas_ocean.ZonalAverage.time_zonal_average('480km')
325M 326M 1.01 quad_hexagon.QuadHexagon.peakmem_open_dataset
324M 323M 1.00 quad_hexagon.QuadHexagon.peakmem_open_grid
7.05±0.1ms 7.02±0.1ms 1.00 quad_hexagon.QuadHexagon.time_open_dataset
6.03±0.1ms 5.90±0.09ms 0.98 quad_hexagon.QuadHexagon.time_open_grid

Benchmarks that have got worse:

Change Before [3228024] After [c57c8f1] Ratio Benchmark (Parameter)
+ 439±10μs 484±10μs 1.1 mpas_ocean.Integrate.time_integrate('480km')

@cmdupuis3

Copy link
Copy Markdown
Collaborator Author

pre-commit.ci autofix

@cmdupuis3

Copy link
Copy Markdown
Collaborator Author

There's some spurious asv results from machine variability, but the benchmarks consistenly show peak-mem reductions and some speedups for cross-sections.

@cmdupuis3
cmdupuis3 requested a review from erogluorhan July 20, 2026 23:25
@cmdupuis3
cmdupuis3 marked this pull request as ready for review July 20, 2026 23:26
@cmdupuis3
cmdupuis3 requested a review from rajeeja July 23, 2026 23:26
@cmdupuis3

Copy link
Copy Markdown
Collaborator Author

pre-commit.ci autofix

@Sevans711
Sevans711 self-requested a review July 27, 2026 16:18

@Sevans711 Sevans711 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @cmdupuis3, thank you for proposing these changes! Overall these look like good clean changes which should help improve the scalability of uxarray.

I have some notes/suggestions/requested changes. Primarily, I noticed that there are missing regression tests. This may be especially important for places with significant changes (more significant than just replacing obj.values with obj.data):

  • UxDataArray.integrate()
  • UxDataArrayCrossSectionAccessor.__call__()
  • uxarray.plot.matplotlib._nearest_neighbor_resample()
  • RemapAccessor.apply_weights()

It may be nice to add a regression test for UxDataset.to_xarray() too, even though the changes here are minor, since that feels like a very core part of the functionality.

The tests could be similar to what you added already in test_topological_agg.py (plus my additional request on that file): ensure that numpy and dask inputs ultimately give the same values (plus assert that the dask inputs lead to dask outputs).

Other parts of the code changes here might benefit from similar tests, but I don't know if that should be necessary. For example, the changes in _geos just replace obj.values with obj.data; does a regression test need to be added for that or no? Curious to hear from @erogluorhan and/or @rajeeja on this question in particular.

Misc. note: I'm not sure if I fully understand the changes to uxarray/cross_sections files. I need to make sure to take a closer look at those during a subsequent review.

Comment thread uxarray/core/aggregation.py
Comment thread uxarray/core/aggregation.py Outdated
Comment thread uxarray/core/aggregation.py
Comment thread uxarray/core/aggregation.py Outdated
Comment thread uxarray/core/dataarray.py Outdated
Comment thread uxarray/core/dataarray.py
Comment thread test/core/test_topological_agg.py
@erogluorhan erogluorhan changed the title Devalue uxarray to make it less expensive Avoid converting chunked data to Numpy arrays (i.e. .values calls) in the code Jul 27, 2026
@erogluorhan erogluorhan changed the title Avoid converting chunked data to Numpy arrays (i.e. .values calls) in the code Avoid converting chunked data to Numpy arrays (i.e. .values calls) Jul 27, 2026
@cmdupuis3

Copy link
Copy Markdown
Collaborator Author

pre-commit.ci autofix

@cmdupuis3
cmdupuis3 requested a review from Sevans711 July 28, 2026 16:54
@cmdupuis3

Copy link
Copy Markdown
Collaborator Author

@erogluorhan Sam and I were wondering about your philosophy with respect to dask versus numpy routines. I was thinking that if we have a case where the numpy routine could be faster than a dask routine in some situations, we might want to keep both, or maybe you'd want to go all in on dask for simplicity.

if isinstance(uxda.data, np.ndarray):
    aggregated_var = _apply_node_to_face_aggregation_numpy(uxda, ...)
elif isinstance(uxda.data, da.Array):
    # apply aggregation on dask array, TODO:
    aggregated_var = _apply_node_to_face_aggregation_numpy(uxda, ...)
else:
    raise ValueError

This is something in main's aggregate.py. I fleshed out the dask branch, but now we still have this logic, and I left the numpy routine in on this branch.

@erogluorhan

Copy link
Copy Markdown
Member

@erogluorhan Sam and I were wondering about your philosophy with respect to dask versus numpy routines. I was thinking that if we have a case where the numpy routine could be faster than a dask routine in some situations, we might want to keep both, or maybe you'd want to go all in on dask for simplicity.

if isinstance(uxda.data, np.ndarray):
    aggregated_var = _apply_node_to_face_aggregation_numpy(uxda, ...)
elif isinstance(uxda.data, da.Array):
    # apply aggregation on dask array, TODO:
    aggregated_var = _apply_node_to_face_aggregation_numpy(uxda, ...)
else:
    raise ValueError

This is something in main's aggregate.py. I fleshed out the dask branch, but now we still have this logic, and I left the numpy routine in on this branch.

If I am understanding this correctly, question is about the use of routines, not data structures. If so, using standard NumPy functions directly on chunked Dask-backed Xarray objects should be completely safe with chunks. Let me know if this helps.

@github-project-automation github-project-automation Bot moved this to 👀 In review in UXarray Development Aug 7, 2026
@cmdupuis3 cmdupuis3 moved this from 👀 In review to 🏗 In progress in UXarray Development Aug 7, 2026
@cmdupuis3 cmdupuis3 moved this from 🏗 In progress to 👀 In review in UXarray Development Aug 7, 2026
cmdupuis3 and others added 6 commits August 10, 2026 09:38
A stash pop was committed in 9cfd53e with its markers intact, making the
module a syntax error. Both sides were additive, so keep both.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

@Sevans711 Sevans711 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks almost ready to merge, I just have a few minor comments remaining!

Requires response:

  • I noticed the mpas_ocean.Integrate.time_integrate('480km') benchmark has worsened slightly. Is this expected behavior? Do you think this is real, a rounding error, or something else?
  • I would suggest to remove all of the pytest.importorskip calls; I left an inline comment with more details.

The rest of this comment does not require response. It includes the notes I wrote down, for future reference.

Other Benchmarking:

  • The cross sections benchmarks seem to have improved, which is great!
  • I'm ignoring peakmem "improvements" (as per #1605)
  • Even though other benchmarks didn't show notable improvements, I think that is fine, because they didn't get worse, either. Also, this PR isn't fully closing the original issue, anyway, it is just addressing part of it.

Testing:

I checked all the cases where I previously requested tests for correctness (numpy & dask give same result) and regression tests (check dask inputs cause dask outputs); here is what I found:

  • (Looks done to me! Confirmed tests pass here, fail on main.) UxDataArray.integrate()
  • (Looks done to me! Confirmed tests pass here, fail on main. Also, the tests do a good job covering a variety of possible failure cases, by including multiple dimensions and some nan / some non-nan values.) UxDataArrayCrossSectionAccessor.__call__()
  • (Not done, but now I'm less sure if it's necessary; left an inline comment to discuss.) uxarray.plot.matplotlib._nearest_neighbor_resample()
  • (Looks done to me! Confirmed tests pass here, fail on main. Also, the tests do a good job covering nontrivial cases, like handling multiple dimensions.) RemapAccessor.apply_weights()
  • (Not done, but optional; no need to block merging for this.) UxDataset.to_xarray()

Previously I noted I need to look closer at cross sections. After doing so and considering the new cross sections tests, I am feeling convinced that the cross sections changes should be working as intended. Noting that the extra dims included in those tests might also help with #1461.

# gather only the sampled faces (lazily for dask data): many pixels share a
# face, so deduplicate to materialize the minimal set rather than the whole
# field, then scatter back via the inverse map
unique_faces, inverse = np.unique(first_face[mask_has_face], return_inverse=True)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was the one remaining case I had noted originally as "should have a regression test" which doesn't have such a test yet. Looking into it further, now I understand the result is going to be a numpy array anyway; this doesn't change inputs or outputs at all, it only changes internal computations a bit for a possible speedup.

I suspect this functionality is already covered by the test suite; a variety of tests call to_raster() already, and I confirmed (via adding a print statement) these lines of code are getting run >10 times during the test suite.

So, actually, no need to add any tests here, I think. Feel free to mark this as resolved once you took a quick look, if you agree it doesn't need tests.


def test_node_to_face_dask_reproduces_numpy(gridpath):
# the numpy (eager) and dask (chunked) branches must agree
da = pytest.importorskip("dask") # dask-backed branch requires dask

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove the importorskip calls everywhere; tests should crash if dask is not installed, not be skipped silently (well, mostly silently). Existing tests currently on main already use dask without importorskip, and the CI for the test suite installs dask, so it should be safe to assume dask is available.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we're assuming that dask is available for these tests though, why can't we assume that in the source code? My strategy lately has been to hedge with the assumption that dask will eventually be optional at the package level, but you're saying here I should be moving in the opposite direction?

@cmdupuis3

Copy link
Copy Markdown
Collaborator Author

I noticed the mpas_ocean.Integrate.time_integrate('480km') benchmark has worsened slightly. Is this expected behavior? Do you think this is real, a rounding error, or something else?

It isn't real, you can rerun the benchmarks and it'll probably disappear. There's always a chance with the smaller benchmarks that they'll trigger due to machine variability. 1.1x is pretty suspect.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

run-benchmark Run ASV benchmark workflow scalability Related to scalability & performance efforts

Projects

Status: 👀 In review

Development

Successfully merging this pull request may close these issues.

4 participants