Skip to content

Conversation

@bjlittle
Copy link
Member

@bjlittle bjlittle commented Jul 5, 2022

🚀 Pull Request

Description

This PR is a follow-on from PR #4840, which extended our CI testing support to cover py310 but unfortunately introduced a significant performance regression (Issue #4843) due to a necessary fix within iris.coords.Cell to circumvent changed behaviour in numpy.nan hashing.

This PR provides a performant alternative implementation, and thus restores the prior performance status quo.

Refer to the following benchmarking results comparing a commit based on this PR against upstream/main of iris.

Benchmarks Summary...
   before           after         ratio
 [c0c86c21]       [7e710259]
 <main~1>         <fix-cell-hash>
          n/a              n/a      n/a  aux_factory.FactoryCommon.time_create
   8.03±0.1μs      7.83±0.07μs     0.97  aux_factory.HybridHeightFactory.time_create
   9.87±0.2μs       9.64±0.2μs     0.98  coords.AncillaryVariable.time_create
      763±6ns         771±20ns     1.01  coords.AuxCoord.time_bounds
   18.0±0.2μs       17.6±0.3μs     0.98  coords.AuxCoord.time_create
      695±9ns         707±10ns     1.02  coords.AuxCoord.time_points
      349±9μs         352±10μs     1.01  coords.AuxCoordLazy.time_bounds
   26.0±0.6μs       26.0±0.8μs     1.00  coords.AuxCoordLazy.time_create
     347±10μs         352±10μs     1.01  coords.AuxCoordLazy.time_points
   10.6±0.1μs       10.7±0.4μs     1.01  coords.CellMeasure.time_create
  1.85±0.02μs      1.83±0.01μs     0.99  coords.CellMethod.time_create
          n/a              n/a      n/a  coords.CoordCommon.time_create
      216±7μs          220±7μs     1.02  coords.DimCoord.time_create
     65.0±1μs         66.7±1μs     1.03  coords.DimCoord.time_regular
   1.63±0.02s       1.64±0.04s     1.01  cube.Aggregation.time_aggregated_by
   55.2±0.4μs       55.2±0.4μs     1.00  cube.AncillaryVariable.time_add
   13.2±0.2μs       12.9±0.2μs     0.97  cube.AncillaryVariable.time_create
   65.0±0.5μs       65.1±0.4μs     1.00  cube.AuxCoord.time_add
   10.6±0.2μs       10.7±0.1μs     1.00  cube.AuxCoord.time_create
  8.12±0.09μs      8.01±0.05μs     0.99  cube.AuxCoord.time_return_coord_dims
  5.38±0.06μs      5.31±0.03μs     0.99  cube.AuxCoord.time_return_coords
   77.9±0.9μs         78.8±1μs     1.01  cube.AuxFactory.time_add
   14.0±0.3μs       14.0±0.3μs     1.00  cube.AuxFactory.time_create
   55.9±0.3μs       55.7±0.4μs     1.00  cube.CellMeasure.time_add
   13.5±0.2μs      13.4±0.09μs     0.99  cube.CellMeasure.time_create
   46.1±0.3μs       46.9±0.3μs     1.02  cube.CellMethod.time_add
  6.99±0.09μs      7.00±0.09μs     1.00  cube.CellMethod.time_create
          n/a              n/a      n/a  cube.ComponentCommon.time_add
          n/a              n/a      n/a  cube.ComponentCommon.time_create
      202±3ms          202±3ms     1.00  cube.Concatenate.time_concatenate
  6.40±0.04μs      6.50±0.06μs     1.02  cube.Cube.time_basic
      104±8ns          107±4ns     1.02  cube.Cube.time_rename
      253±5μs          257±2μs     1.02  cube.Equality.time_equality
    1.35±0.9s        1.33±0.4s     0.99  cube.Merge.time_merge
     37.0±1μs         38.0±1μs     1.03  cube.MeshCoord.time_add(10000)
     47.2±5μs         46.2±5μs     0.98  cube.MeshCoord.time_add(1000000)
     36.2±1μs         37.2±2μs     1.03  cube.MeshCoord.time_add(6)
   18.3±0.3μs       18.3±0.3μs     1.00  cube.MeshCoord.time_create(10000)
   18.3±0.3μs       18.1±0.2μs     0.98  cube.MeshCoord.time_create(1000000)
   18.5±0.4μs       18.1±0.2μs     0.98  cube.MeshCoord.time_create(6)
     91.9±4μs         94.1±7μs     1.02  cube.MeshCoord.time_remove(10000)
      115±2μs          116±3μs     1.01  cube.MeshCoord.time_remove(1000000)
     89.7±7μs         89.3±5μs     1.00  cube.MeshCoord.time_remove(6)
   3.53±0.4ms       3.53±0.5ms     1.00  experimental.ugrid.Connectivity.time_create(1000000)
   2.61±0.3ms       2.59±0.2ms     0.99  experimental.ugrid.Connectivity.time_create(6)
  1.13±0.02μs      1.15±0.02μs     1.02  experimental.ugrid.Connectivity.time_indices(1000000)
  1.13±0.02μs      1.15±0.02μs     1.02  experimental.ugrid.Connectivity.time_indices(6)
     32.0±4ms         38.0±4ms     1.19  experimental.ugrid.Connectivity.time_location_lengths(1000000)
  3.61±0.05ms      3.65±0.07ms     1.01  experimental.ugrid.Connectivity.time_location_lengths(6)
     35.9±4ms         39.0±5ms     1.09  experimental.ugrid.Connectivity.time_validate_indices(1000000)
   5.48±0.1ms       5.51±0.6ms     1.00  experimental.ugrid.Connectivity.time_validate_indices(6)
   5.82±0.2ms       6.21±0.4ms     1.07  experimental.ugrid.ConnectivityLazy.time_create(1000000)
  4.26±0.06ms       4.38±0.2ms     1.03  experimental.ugrid.ConnectivityLazy.time_create(6)
      323±9μs         327±10μs     1.01  experimental.ugrid.ConnectivityLazy.time_indices(1000000)
      323±9μs         323±10μs     1.00  experimental.ugrid.ConnectivityLazy.time_indices(6)
   32.3±0.5ms       32.6±0.7ms     1.01  experimental.ugrid.ConnectivityLazy.time_location_lengths(1000000)
   3.95±0.1ms       3.96±0.1ms     1.00  experimental.ugrid.ConnectivityLazy.time_location_lengths(6)
   36.1±0.7ms       36.3±0.5ms     1.01  experimental.ugrid.ConnectivityLazy.time_validate_indices(1000000)
   5.82±0.1ms       5.83±0.1ms     1.00  experimental.ugrid.ConnectivityLazy.time_validate_indices(6)
   8.63±0.1ms       8.98±0.1ms     1.04  experimental.ugrid.Mesh.time_add_connectivities(1000000)
      451±4μs          458±4μs     1.01  experimental.ugrid.Mesh.time_add_connectivities(6)
  7.91±0.06μs       7.87±0.1μs     0.99  experimental.ugrid.Mesh.time_add_coords(1000000)
  7.83±0.09μs      7.87±0.03μs     1.00  experimental.ugrid.Mesh.time_add_coords(6)
  5.40±0.03μs      5.43±0.06μs     1.01  experimental.ugrid.Mesh.time_connectivities(1000000)
  5.40±0.04μs      5.42±0.07μs     1.00  experimental.ugrid.Mesh.time_connectivities(6)
  6.74±0.05μs      6.85±0.06μs     1.02  experimental.ugrid.Mesh.time_coords(1000000)
   6.92±0.1μs      6.87±0.06μs     0.99  experimental.ugrid.Mesh.time_coords(6)
   8.78±0.1ms       9.01±0.2ms     1.03  experimental.ugrid.Mesh.time_create(1000000)
      544±8μs          545±6μs     1.00  experimental.ugrid.Mesh.time_create(6)
   25.3±0.8ms         26.0±1ms     1.03  experimental.ugrid.Mesh.time_eq(1000000)
     476±10μs          483±9μs     1.02  experimental.ugrid.Mesh.time_eq(6)
  5.28±0.04μs      5.31±0.05μs     1.01  experimental.ugrid.Mesh.time_remove_connectivities(1000000)
  5.32±0.06μs      5.33±0.06μs     1.00  experimental.ugrid.Mesh.time_remove_connectivities(6)
  8.43±0.05μs      8.49±0.08μs     1.01  experimental.ugrid.Mesh.time_remove_coords(1000000)
   8.49±0.2μs      8.46±0.06μs     1.00  experimental.ugrid.Mesh.time_remove_coords(6)
   9.09±0.2μs       8.95±0.2μs     0.98  experimental.ugrid.MeshCoord.time_bounds(10000)
   8.98±0.1μs       8.98±0.2μs     1.00  experimental.ugrid.MeshCoord.time_bounds(1000000)
   9.03±0.2μs       9.08±0.2μs     1.01  experimental.ugrid.MeshCoord.time_bounds(6)
      488±3μs          492±5μs     1.01  experimental.ugrid.MeshCoord.time_create(10000)
   33.1±0.7ms       34.0±0.6ms     1.02  experimental.ugrid.MeshCoord.time_create(1000000)
      301±4μs          299±3μs     0.99  experimental.ugrid.MeshCoord.time_create(6)
  4.95±0.05μs      4.92±0.04μs     0.99  experimental.ugrid.MeshCoord.time_points(10000)
  4.96±0.04μs      4.92±0.03μs     0.99  experimental.ugrid.MeshCoord.time_points(1000000)
  4.98±0.04μs      4.91±0.07μs     0.99  experimental.ugrid.MeshCoord.time_points(6)
   11.1±0.2ms       11.1±0.2ms     1.00  experimental.ugrid.MeshCoordLazy.time_bounds(10000)
      346±4ms          346±6ms     1.00  experimental.ugrid.MeshCoordLazy.time_bounds(1000000)
   10.1±0.2ms       10.1±0.2ms     1.00  experimental.ugrid.MeshCoordLazy.time_bounds(6)
  5.57±0.04ms      5.57±0.05ms     1.00  experimental.ugrid.MeshCoordLazy.time_create(10000)
  5.60±0.07ms      5.59±0.07ms     1.00  experimental.ugrid.MeshCoordLazy.time_create(1000000)
  5.53±0.06ms      5.55±0.05ms     1.00  experimental.ugrid.MeshCoordLazy.time_create(6)
   3.83±0.1ms      3.82±0.09ms     1.00  experimental.ugrid.MeshCoordLazy.time_points(10000)
   6.80±0.1ms       6.78±0.1ms     1.00  experimental.ugrid.MeshCoordLazy.time_points(1000000)
   3.88±0.1ms       3.85±0.1ms     0.99  experimental.ugrid.MeshCoordLazy.time_points(6)
     54.8±2μs         55.0±1μs     1.00  experimental.ugrid.MeshLazy.time_add_connectivities(1000000)
     53.0±1μs         53.7±1μs     1.01  experimental.ugrid.MeshLazy.time_add_connectivities(6)
   29.2±0.6μs       30.0±0.6μs     1.03  experimental.ugrid.MeshLazy.time_add_coords(1000000)
   27.4±0.9μs         28.8±1μs     1.05  experimental.ugrid.MeshLazy.time_add_coords(6)
   19.4±0.5μs       19.9±0.5μs     1.02  experimental.ugrid.MeshLazy.time_connectivities(1000000)
   18.7±0.5μs       19.2±0.6μs     1.03  experimental.ugrid.MeshLazy.time_connectivities(6)
   24.9±0.5μs       24.8±0.5μs     1.00  experimental.ugrid.MeshLazy.time_coords(1000000)
   24.1±0.6μs       24.3±0.6μs     1.01  experimental.ugrid.MeshLazy.time_coords(6)
      128±4μs          130±6μs     1.01  experimental.ugrid.MeshLazy.time_create(1000000)
      125±4μs          126±2μs     1.01  experimental.ugrid.MeshLazy.time_create(6)
      184±2ms          186±3ms     1.01  experimental.ugrid.MeshLazy.time_eq(1000000)
   49.7±0.8ms       49.4±0.7ms     1.00  experimental.ugrid.MeshLazy.time_eq(6)
   21.7±0.5μs       21.8±0.6μs     1.01  experimental.ugrid.MeshLazy.time_remove_connectivities(1000000)
   20.3±0.8μs       20.9±0.9μs     1.03  experimental.ugrid.MeshLazy.time_remove_connectivities(6)
   42.9±0.8μs       43.2±0.8μs     1.01  experimental.ugrid.MeshLazy.time_remove_coords(1000000)
   41.4±0.8μs       41.5±0.7μs     1.00  experimental.ugrid.MeshLazy.time_remove_coords(6)
          n/a              n/a      n/a  experimental.ugrid.UGridCommon.time_create(1000000)
          n/a              n/a      n/a  experimental.ugrid.UGridCommon.time_create(6)
      854±9ns          850±5ns     0.99  experimental.ugrid.regions_combine.CombineRegionsComputeRealData.time_compute_data(4)
      382±3ms          382±6ms     1.00  experimental.ugrid.regions_combine.CombineRegionsComputeRealData.time_compute_data(500)
          5.0              5.0     1.00  experimental.ugrid.regions_combine.CombineRegionsComputeRealData.track_addedmem_compute_data(4)
   54.6796875           57.375     1.05  experimental.ugrid.regions_combine.CombineRegionsComputeRealData.track_addedmem_compute_data(500)
  19.4±0.07ms       19.3±0.2ms     0.99  experimental.ugrid.regions_combine.CombineRegionsCreateCube.time_create_combined_cube(4)
   22.9±0.1ms       22.9±0.1ms     1.00  experimental.ugrid.regions_combine.CombineRegionsCreateCube.time_create_combined_cube(500)
          5.0              5.0     1.00  experimental.ugrid.regions_combine.CombineRegionsCreateCube.track_addedmem_create_combined_cube(4)
          5.0              5.0     1.00  experimental.ugrid.regions_combine.CombineRegionsCreateCube.track_addedmem_create_combined_cube(500)
      139±3ms        138±0.8ms     0.99  experimental.ugrid.regions_combine.CombineRegionsFileStreamedCalc.time_stream_file2file(4)
   1.09±0.08s       1.05±0.04s     0.97  experimental.ugrid.regions_combine.CombineRegionsFileStreamedCalc.time_stream_file2file(500)
          5.0              5.0     1.00  experimental.ugrid.regions_combine.CombineRegionsFileStreamedCalc.track_addedmem_stream_file2file(4)
   61.0390625        63.765625     1.04  experimental.ugrid.regions_combine.CombineRegionsFileStreamedCalc.track_addedmem_stream_file2file(500)
     65.4±1ms       65.1±0.9ms     1.00  experimental.ugrid.regions_combine.CombineRegionsSaveData.time_save(4)
     908±30ms         896±40ms     0.99  experimental.ugrid.regions_combine.CombineRegionsSaveData.time_save(500)
          5.0              5.0     1.00  experimental.ugrid.regions_combine.CombineRegionsSaveData.track_addedmem_save(4)
  61.05859375      63.77734375     1.04  experimental.ugrid.regions_combine.CombineRegionsSaveData.track_addedmem_save(500)
      0.03161          0.03161     1.00  experimental.ugrid.regions_combine.CombineRegionsSaveData.track_filesize_saved(4)
    216.01708        216.01708     1.00  experimental.ugrid.regions_combine.CombineRegionsSaveData.track_filesize_saved(500)
     850±10μs         844±10μs     0.99  import_iris.Iris.time__concatenate
      277±8μs         282±10μs     1.02  import_iris.Iris.time__constraints
      180±3μs          179±3μs     0.99  import_iris.Iris.time__data_manager
      161±5μs          161±3μs     1.00  import_iris.Iris.time__deprecation
      186±2μs          187±5μs     1.00  import_iris.Iris.time__lazy_data
  1.31±0.02ms      1.34±0.03ms     1.02  import_iris.Iris.time__merge
      117±2μs          124±3μs     1.06  import_iris.Iris.time__representation
     659±10μs          671±9μs     1.02  import_iris.Iris.time_analysis
      236±2μs          238±2μs     1.01  import_iris.Iris.time_analysis__area_weighted
      171±3μs          172±2μs     1.01  import_iris.Iris.time_analysis__grid_angles
      374±5μs          383±5μs     1.02  import_iris.Iris.time_analysis__interpolation
      275±3μs          277±5μs     1.01  import_iris.Iris.time_analysis__regrid
      182±4μs          184±2μs     1.01  import_iris.Iris.time_analysis__scipy_interpolate
      209±2μs          215±3μs     1.03  import_iris.Iris.time_analysis_calculus
      472±6μs          470±3μs     1.00  import_iris.Iris.time_analysis_cartography
      141±2μs          142±3μs     1.01  import_iris.Iris.time_analysis_geomerty
      355±4μs          357±5μs     1.00  import_iris.Iris.time_analysis_maths
      139±2μs          139±3μs     1.00  import_iris.Iris.time_analysis_stats
      288±3μs          295±5μs     1.03  import_iris.Iris.time_analysis_trajectory
     441±10μs         435±10μs     0.98  import_iris.Iris.time_aux_factory
      132±3μs          136±3μs     1.03  import_iris.Iris.time_common
      274±5μs          276±6μs     1.01  import_iris.Iris.time_common_lenient
  1.37±0.03ms      1.42±0.03ms     1.04  import_iris.Iris.time_common_metadata
      220±6μs          221±3μs     1.01  import_iris.Iris.time_common_mixin
  1.52±0.02ms      1.52±0.02ms     0.99  import_iris.Iris.time_common_resolve
      344±3μs          350±4μs     1.02  import_iris.Iris.time_config
      183±4μs        187±0.9μs     1.02  import_iris.Iris.time_coord_categorisation
     501±10μs         500±20μs     1.00  import_iris.Iris.time_coord_systems
  1.02±0.03ms      1.10±0.04ms     1.07  import_iris.Iris.time_coords
     779±30μs         778±50μs     1.00  import_iris.Iris.time_cube
      336±6μs          335±3μs     1.00  import_iris.Iris.time_exceptions
      119±2μs          123±2μs     1.03  import_iris.Iris.time_experimental
      314±2μs          317±3μs     1.01  import_iris.Iris.time_fileformats
      355±5μs          361±9μs     1.02  import_iris.Iris.time_fileformats__ff
  2.79±0.05ms       2.87±0.1ms     1.03  import_iris.Iris.time_fileformats__ff_cross_references
      120±2μs          124±2μs     1.04  import_iris.Iris.time_fileformats__pp_lbproc_pairs
      185±3μs          189±3μs     1.02  import_iris.Iris.time_fileformats_abf
     502±20μs         514±20μs     1.02  import_iris.Iris.time_fileformats_cf
     11.5±1ms         11.7±2ms     1.02  import_iris.Iris.time_fileformats_dot
      114±2μs          117±2μs     1.03  import_iris.Iris.time_fileformats_name
      373±2μs          380±2μs     1.02  import_iris.Iris.time_fileformats_name_loaders
     818±10μs         832±20μs     1.02  import_iris.Iris.time_fileformats_netcdf
      197±2μs          195±5μs     0.99  import_iris.Iris.time_fileformats_nimrod
      313±3μs          312±5μs     1.00  import_iris.Iris.time_fileformats_nimrod_load_rules
     952±30μs         957±30μs     1.01  import_iris.Iris.time_fileformats_pp
      271±3μs          276±4μs     1.02  import_iris.Iris.time_fileformats_pp_load_rules
      199±2μs          200±3μs     1.01  import_iris.Iris.time_fileformats_pp_save_rules
     712±10μs         719±10μs     1.01  import_iris.Iris.time_fileformats_rules
      343±4μs          353±8μs     1.03  import_iris.Iris.time_fileformats_structured_array_identification
      129±2μs          134±3μs     1.04  import_iris.Iris.time_fileformats_um
      271±4μs          275±5μs     1.02  import_iris.Iris.time_fileformats_um__fast_load
      232±7μs          239±5μs     1.03  import_iris.Iris.time_fileformats_um__fast_load_structured_fields
      117±3μs          120±1μs     1.03  import_iris.Iris.time_fileformats_um__ff_replacement
      134±2μs          136±2μs     1.01  import_iris.Iris.time_fileformats_um__optimal_array_structuring
  1.10±0.01ms      1.11±0.01ms     1.01  import_iris.Iris.time_fileformats_um_cf_map
      219±1μs          227±2μs     1.04  import_iris.Iris.time_io
      276±5μs          285±7μs     1.03  import_iris.Iris.time_io_format_picker
      318±2μs          324±4μs     1.02  import_iris.Iris.time_iris
      211±3μs          217±4μs     1.03  import_iris.Iris.time_iterate
  17.3±0.09ms       17.4±0.2ms     1.01  import_iris.Iris.time_palette
      454±5μs          455±4μs     1.00  import_iris.Iris.time_plot
      167±2μs          170±3μs     1.02  import_iris.Iris.time_quickplot
  2.12±0.05ms      2.12±0.06ms     1.00  import_iris.Iris.time_std_names
  3.55±0.06ms      3.62±0.07ms     1.02  import_iris.Iris.time_symbols
      120±8ms          121±7ms     1.01  import_iris.Iris.time_tests
      314±4μs          318±6μs     1.01  import_iris.Iris.time_third_party_cartopy
   7.95±0.3ms       8.04±0.4ms     1.01  import_iris.Iris.time_third_party_cf_units
      169±3μs          172±3μs     1.02  import_iris.Iris.time_third_party_cftime
   4.58±0.1ms      4.59±0.09ms     1.00  import_iris.Iris.time_third_party_matplotlib
     1.38±0ms      1.39±0.01ms     1.01  import_iris.Iris.time_third_party_numpy
  2.22±0.02ms      2.25±0.05ms     1.01  import_iris.Iris.time_third_party_scipy
      170±2μs          172±2μs     1.01  import_iris.Iris.time_time
      413±2μs          421±5μs     1.02  import_iris.Iris.time_util
      129±2μs          132±7μs     1.02  iterate.IZip.time_izip
  13.1±0.09ms       12.9±0.1ms     0.98  load.LoadAndRealise.time_load((1280, 960, 5), False, 'FF')
   42.5±0.6ms       42.4±0.7ms     1.00  load.LoadAndRealise.time_load((1280, 960, 5), False, 'NetCDF')
  14.3±0.06ms      14.2±0.08ms     1.00  load.LoadAndRealise.time_load((1280, 960, 5), False, 'PP')
  13.1±0.07ms      12.9±0.05ms     0.99  load.LoadAndRealise.time_load((1280, 960, 5), True, 'FF')
   42.4±0.6ms       42.3±0.5ms     1.00  load.LoadAndRealise.time_load((1280, 960, 5), True, 'NetCDF')
   14.3±0.1ms      14.1±0.05ms     0.99  load.LoadAndRealise.time_load((1280, 960, 5), True, 'PP')
    8.79±0.1s       8.68±0.04s     0.99  load.LoadAndRealise.time_load((2, 2, 1000), False, 'FF')
   40.6±0.7ms       40.2±0.6ms     0.99  load.LoadAndRealise.time_load((2, 2, 1000), False, 'NetCDF')
    9.13±0.2s       9.07±0.07s     0.99  load.LoadAndRealise.time_load((2, 2, 1000), False, 'PP')
   8.74±0.09s       8.72±0.04s     1.00  load.LoadAndRealise.time_load((2, 2, 1000), True, 'FF')
   40.6±0.5ms       40.4±0.4ms     0.99  load.LoadAndRealise.time_load((2, 2, 1000), True, 'NetCDF')
    9.06±0.2s       9.01±0.06s     0.99  load.LoadAndRealise.time_load((2, 2, 1000), True, 'PP')
   6.17±0.2ms       6.12±0.3ms     0.99  load.LoadAndRealise.time_load((2, 2, 2), False, 'FF')
   40.3±0.4ms       39.7±0.7ms     0.98  load.LoadAndRealise.time_load((2, 2, 2), False, 'NetCDF')
  6.54±0.03ms       6.38±0.1ms     0.97  load.LoadAndRealise.time_load((2, 2, 2), False, 'PP')
   6.08±0.1ms       5.91±0.2ms     0.97  load.LoadAndRealise.time_load((2, 2, 2), True, 'FF')
   40.2±0.8ms       40.4±0.8ms     1.00  load.LoadAndRealise.time_load((2, 2, 2), True, 'NetCDF')
   6.50±0.1ms       6.30±0.2ms     0.97  load.LoadAndRealise.time_load((2, 2, 2), True, 'PP')
     56.0±4ms         66.8±6ms     1.19  load.LoadAndRealise.time_realise((1280, 960, 5), False, 'FF')
   41.8±0.3ms       42.1±0.3ms     1.01  load.LoadAndRealise.time_realise((1280, 960, 5), False, 'NetCDF')
     16.2±1ms       16.4±0.7ms     1.01  load.LoadAndRealise.time_realise((1280, 960, 5), False, 'PP')
   31.4±0.9ms       31.5±0.8ms     1.00  load.LoadAndRealise.time_realise((1280, 960, 5), True, 'FF')
    101±0.5ms        102±0.7ms     1.00  load.LoadAndRealise.time_realise((1280, 960, 5), True, 'NetCDF')
     32.4±1ms         31.9±1ms     0.99  load.LoadAndRealise.time_realise((1280, 960, 5), True, 'PP')
      548±4ms          558±6ms     1.02  load.LoadAndRealise.time_realise((2, 2, 1000), False, 'FF')
  4.13±0.06ms      4.07±0.05ms     0.98  load.LoadAndRealise.time_realise((2, 2, 1000), False, 'NetCDF')
      552±4ms          559±1ms     1.01  load.LoadAndRealise.time_realise((2, 2, 1000), False, 'PP')
    561±0.7ms          569±6ms     1.01  load.LoadAndRealise.time_realise((2, 2, 1000), True, 'FF')
  4.28±0.08ms      4.11±0.09ms     0.96  load.LoadAndRealise.time_realise((2, 2, 1000), True, 'NetCDF')
      572±2ms          573±8ms     1.00  load.LoadAndRealise.time_realise((2, 2, 1000), True, 'PP')
   1.78±0.4ms       1.70±0.2ms     0.95  load.LoadAndRealise.time_realise((2, 2, 2), False, 'FF')
   4.06±0.1ms       4.06±0.2ms     1.00  load.LoadAndRealise.time_realise((2, 2, 2), False, 'NetCDF')
  1.49±0.02ms      1.52±0.03ms     1.02  load.LoadAndRealise.time_realise((2, 2, 2), False, 'PP')
  1.52±0.03ms      1.53±0.03ms     1.01  load.LoadAndRealise.time_realise((2, 2, 2), True, 'FF')
   4.18±0.1ms       4.11±0.1ms     0.98  load.LoadAndRealise.time_realise((2, 2, 2), True, 'NetCDF')
  1.50±0.03ms      1.52±0.03ms     1.01  load.LoadAndRealise.time_realise((2, 2, 2), True, 'PP')
      161±1ms          162±2ms     1.01  load.ManyVars.time_many_var_load
   13.3±0.1ms       13.1±0.2ms     0.99  load.STASHConstraint.time_stash_constraint((1280, 960, 5), 'FF')
  14.6±0.08ms       14.3±0.1ms     0.98  load.STASHConstraint.time_stash_constraint((1280, 960, 5), 'PP')
   8.70±0.06s       8.72±0.07s     1.00  load.STASHConstraint.time_stash_constraint((2, 2, 1000), 'FF')
    9.14±0.1s       9.03±0.06s     0.99  load.STASHConstraint.time_stash_constraint((2, 2, 1000), 'PP')
   6.28±0.3ms       6.20±0.2ms     0.99  load.STASHConstraint.time_stash_constraint((2, 2, 2), 'FF')
  6.72±0.04ms       6.43±0.2ms     0.96  load.STASHConstraint.time_stash_constraint((2, 2, 2), 'PP')
  13.1±0.08ms      13.0±0.09ms     0.99  load.StructuredFF.time_structured_load((1280, 960, 5), False)
  6.89±0.06ms      6.90±0.05ms     1.00  load.StructuredFF.time_structured_load((1280, 960, 5), True)
   8.80±0.09s       8.73±0.03s     0.99  load.StructuredFF.time_structured_load((2, 2, 1000), False)
      472±3ms          472±3ms     1.00  load.StructuredFF.time_structured_load((2, 2, 1000), True)
   6.21±0.2ms       6.01±0.1ms     0.97  load.StructuredFF.time_structured_load((2, 2, 2), False)
  5.36±0.06ms       5.32±0.1ms     0.99  load.StructuredFF.time_structured_load((2, 2, 2), True)
      225±2ms          224±2ms     1.00  load.TimeConstraint.time_time_constraint(20, 'FF')
   51.3±0.6ms       51.4±0.9ms     1.00  load.TimeConstraint.time_time_constraint(20, 'NetCDF')
      249±2ms          250±2ms     1.01  load.TimeConstraint.time_time_constraint(20, 'PP')
     47.4±1ms       46.4±0.5ms     0.98  load.TimeConstraint.time_time_constraint(3, 'FF')
   45.6±0.6ms       45.8±0.7ms     1.01  load.TimeConstraint.time_time_constraint(3, 'NetCDF')
   49.5±0.5ms       49.4±0.2ms     1.00  load.TimeConstraint.time_time_constraint(3, 'PP')
     41.8±1ms         42.5±1ms     1.02  load.ugrid.BasicLoading.time_load_file(1)
   44.0±0.1ms       45.8±0.7ms     1.04  load.ugrid.BasicLoading.time_load_file(200000)
   16.3±0.6ms       16.5±0.5ms     1.01  load.ugrid.BasicLoading.time_load_mesh(1)
   18.3±0.4ms       18.5±0.5ms     1.01  load.ugrid.BasicLoading.time_load_mesh(200000)
   41.9±0.9ms         42.3±1ms     1.01  load.ugrid.BasicLoadingTime.time_load_file(1)
   40.7±0.3ms         41.9±1ms     1.03  load.ugrid.BasicLoadingTime.time_load_file(200000)
   16.5±0.8ms       16.2±0.7ms     0.98  load.ugrid.BasicLoadingTime.time_load_mesh(1)
   15.0±0.2ms       15.0±0.2ms     0.99  load.ugrid.BasicLoadingTime.time_load_mesh(200000)
   55.9±0.5ms       56.3±0.4ms     1.01  load.ugrid.Callback.time_load_file_callback(1)
   59.1±0.5ms       59.3±0.3ms     1.00  load.ugrid.Callback.time_load_file_callback(200000)
     55.5±1ms         56.2±1ms     1.01  load.ugrid.CallbackTime.time_load_file_callback(1)
   55.3±0.7ms       56.0±0.4ms     1.01  load.ugrid.CallbackTime.time_load_file_callback(200000)
   4.44±0.2ms       4.46±0.2ms     1.00  load.ugrid.DataRealisation.time_realise_data(1)
   6.36±0.2ms       6.33±0.2ms     0.99  load.ugrid.DataRealisation.time_realise_data(200000)
   4.55±0.3ms       4.42±0.2ms     0.97  load.ugrid.DataRealisationTime.time_realise_data(1)
   1.73±0.03s       1.73±0.01s     1.00  load.ugrid.DataRealisationTime.time_realise_data(200000)
      181±5ns          179±7ns     0.98  metadata_manager_factory.MetadataManagerFactory.time_AncillaryVariableMetadata_fields
  1.20±0.01μs      1.23±0.02μs     1.02  metadata_manager_factory.MetadataManagerFactory.time_AncillaryVariableMetadata_values
      181±6ns          177±2ns     0.98  metadata_manager_factory.MetadataManagerFactory.time_BaseMetadata_fields
  1.21±0.01μs      1.23±0.01μs     1.01  metadata_manager_factory.MetadataManagerFactory.time_BaseMetadata_values
      185±4ns        178±0.8ns     0.96  metadata_manager_factory.MetadataManagerFactory.time_CellMeasuresMetadata_fields
  1.33±0.01μs      1.37±0.01μs     1.02  metadata_manager_factory.MetadataManagerFactory.time_CellMeasuresMetadata_values
      186±4ns          182±1ns     0.98  metadata_manager_factory.MetadataManagerFactory.time_CoordMetadata_fields
  1.46±0.01μs      1.47±0.01μs     1.01  metadata_manager_factory.MetadataManagerFactory.time_CoordMetadata_values
      184±5ns          176±1ns     0.96  metadata_manager_factory.MetadataManagerFactory.time_CubeMetadata_fields
  1.35±0.02μs      1.37±0.01μs     1.01  metadata_manager_factory.MetadataManagerFactory.time_CubeMetadata_values
      183±5ns          178±3ns     0.97  metadata_manager_factory.MetadataManagerFactory.time_DimCoordMetadata_fields
  1.54±0.02μs      1.56±0.01μs     1.01  metadata_manager_factory.MetadataManagerFactory.time_DimCoordMetadata_values
  1.64±0.01μs      1.64±0.01μs     1.00  metadata_manager_factory.MetadataManagerFactory__create.time_AncillaryVariableMetadata(1)
  11.0±0.04μs      11.1±0.04μs     1.00  metadata_manager_factory.MetadataManagerFactory__create.time_AncillaryVariableMetadata(10)
    105±0.5μs        105±0.4μs     1.00  metadata_manager_factory.MetadataManagerFactory__create.time_AncillaryVariableMetadata(100)
  1.63±0.01μs      1.64±0.01μs     1.01  metadata_manager_factory.MetadataManagerFactory__create.time_BaseMetadata(1)
  11.0±0.04μs      11.0±0.05μs     1.00  metadata_manager_factory.MetadataManagerFactory__create.time_BaseMetadata(10)
    105±0.5μs        106±0.5μs     1.01  metadata_manager_factory.MetadataManagerFactory__create.time_BaseMetadata(100)
  1.69±0.01μs      1.69±0.01μs     1.00  metadata_manager_factory.MetadataManagerFactory__create.time_CellMeasureMetadata(1)
  11.5±0.03μs      11.6±0.05μs     1.01  metadata_manager_factory.MetadataManagerFactory__create.time_CellMeasureMetadata(10)
    110±0.5μs        111±0.4μs     1.01  metadata_manager_factory.MetadataManagerFactory__create.time_CellMeasureMetadata(100)
  1.74±0.01μs      1.77±0.01μs     1.02  metadata_manager_factory.MetadataManagerFactory__create.time_CoordMetadata(1)
  12.1±0.06μs      12.3±0.04μs     1.01  metadata_manager_factory.MetadataManagerFactory__create.time_CoordMetadata(10)
    116±0.4μs        119±0.9μs     1.02  metadata_manager_factory.MetadataManagerFactory__create.time_CoordMetadata(100)
  1.69±0.01μs      1.71±0.01μs     1.01  metadata_manager_factory.MetadataManagerFactory__create.time_CubeMetadata(1)
  11.6±0.06μs      11.7±0.07μs     1.01  metadata_manager_factory.MetadataManagerFactory__create.time_CubeMetadata(10)
    111±0.5μs        111±0.4μs     1.01  metadata_manager_factory.MetadataManagerFactory__create.time_CubeMetadata(100)
  1.82±0.01μs      1.84±0.03μs     1.01  metadata_manager_factory.MetadataManagerFactory__create.time_DimCoordMetadata(1)
  12.8±0.05μs      12.8±0.05μs     1.01  metadata_manager_factory.MetadataManagerFactory__create.time_DimCoordMetadata(10)
      123±1μs          124±1μs     1.01  metadata_manager_factory.MetadataManagerFactory__create.time_DimCoordMetadata(100)
      191±3ns          194±4ns     1.02  mixin.CFVariableMixin.time_get_attributes
      187±4ns          197±2ns     1.05  mixin.CFVariableMixin.time_get_long_name
  1.36±0.01μs      1.36±0.01μs     1.00  mixin.CFVariableMixin.time_get_metadata
      186±4ns          192±3ns     1.03  mixin.CFVariableMixin.time_get_standard_name
      188±2ns          197±1ns     1.05  mixin.CFVariableMixin.time_get_units
      188±4ns          196±3ns     1.04  mixin.CFVariableMixin.time_get_var_name
  1.10±0.01μs      1.11±0.01μs     1.01  mixin.CFVariableMixin.time_set_attributes
     241±10ns          254±5ns     1.05  mixin.CFVariableMixin.time_set_long_name
  5.74±0.04μs       5.77±0.2μs     1.00  mixin.CFVariableMixin.time_set_metadata__dict
   6.80±0.1μs       6.81±0.2μs     1.00  mixin.CFVariableMixin.time_set_metadata__metadata
  6.71±0.05μs       6.87±0.2μs     1.02  mixin.CFVariableMixin.time_set_metadata__tuple
     853±20ns          837±5ns     0.98  mixin.CFVariableMixin.time_set_standard_name
     837±10ns          834±5ns     1.00  mixin.CFVariableMixin.time_set_units
      830±6ns         838±30ns     1.01  mixin.CFVariableMixin.time_set_var_name
      429±3ms          429±5ms     1.00  plot.AuxSort.time_aux_sort
      459±9ms          458±3ms     1.00  regridding.HorizontalChunkedRegridding.time_regrid_area_w
     904±20ms          906±5ms     1.00  regridding.HorizontalChunkedRegridding.time_regrid_area_w_new_grid
   4.47±0.4ms       4.36±0.2ms     0.98  save.NetcdfSave.time_netcdf_save_cube(1, False)
   76.0±0.9ms       75.8±0.9ms     1.00  save.NetcdfSave.time_netcdf_save_cube(1, True)
     79.4±9ms         71.0±7ms     0.89  save.NetcdfSave.time_netcdf_save_cube(600, False)
     838±30ms         834±40ms     1.00  save.NetcdfSave.time_netcdf_save_cube(600, True)
      176±3ns          177±5ns     1.00  save.NetcdfSave.time_netcdf_save_mesh(1, False)
   59.1±0.8ms         58.3±1ms     0.99  save.NetcdfSave.time_netcdf_save_mesh(1, True)
      177±3ns          176±3ns     1.00  save.NetcdfSave.time_netcdf_save_mesh(600, False)
     839±70ms         824±30ms     0.98  save.NetcdfSave.time_netcdf_save_mesh(600, True)
          5.0              5.0     1.00  save.NetcdfSave.track_addedmem_netcdf_save(1, False)
          5.0              5.0     1.00  save.NetcdfSave.track_addedmem_netcdf_save(1, True)
          5.0              5.0     1.00  save.NetcdfSave.track_addedmem_netcdf_save(600, False)
  77.03515625        79.921875     1.04  save.NetcdfSave.track_addedmem_netcdf_save(600, True)
   39.6±0.5ms       40.1±0.3ms     1.01  trajectory.TrajectoryInterpolation.time_trajectory_linear
    102±0.6ms        102±0.3ms     1.00  trajectory.TrajectoryInterpolation.time_trajectory_nearest

Closes #4843


Consult Iris pull request check list

Copy link
Member

@lbdreyer lbdreyer left a comment

Choose a reason for hiding this comment

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

Computing the hash value once rather than everytime it is called makes sense to me so I agree that this is a sensible way forward. Although I'm surprised the lines

        try:
            value = 0 if np.isnan(self.point) else hash((self.point,))
        except TypeError:
            # Passing a string to np.isnan causes this exception.
            value = hash((self.point,))

had such an impact on the performance!

This looks good to be merged! Do you think this should include a what's new? I can't seem to find mention of Python 3.10 support in the what's new so maybe that would be good to include (in this PR or a separate one)

@bjlittle
Copy link
Member Author

bjlittle commented Jul 5, 2022

@lbdreyer Awesome! Thanks.

The call to np.nan wrapped in a try...except generally isn't too expensive, but when it's called 100's or 1000's of times, then the overhead accumulates fast. I guess it highlights just how core the use of Cell is within iris. Who knew, right? 😛

I'll add a whatsnew entry that covers #4840, and also mention this PR 👍

@bjlittle
Copy link
Member Author

bjlittle commented Jul 5, 2022

@lbdreyer Done. Back to you 👍

@lbdreyer lbdreyer merged commit 7992fb5 into SciTools:main Jul 5, 2022
@bjlittle
Copy link
Member Author

bjlittle commented Jul 5, 2022

@lbdreyer Brilliant! 🥳

@trexfeathers
Copy link
Contributor

Sorry to crash the party folks (I should have spotted this yesterday), but the results @bjlittle posted yesterday only show that things have stayed the same. If we had fixed the performance we should have expected some significant reductions in benchmark times. 😔

@bjlittle bjlittle deleted the fix-cell-hash branch July 7, 2022 09:39
lbdreyer added a commit to lbdreyer/iris that referenced this pull request Sep 14, 2022
* 3.2 version and whats new (#4559)

* Reset whats new (#4563)

* reset whats new

* Specify minor in whats new

* update trove classifiers (#4564)

* Update version to 3.3.dev0 (#4565)

* Updated environment lockfiles (#4567)

Co-authored-by: Lockfile bot <[email protected]>

* New tool-agnostic ASV environment management (#4571)

* New tool-agnostic ASV env management.

* Benchmarking only build the latest Python.

* Increase benchmark accuracy by increasing rounds.

* Fix ASV rounds mistake.

* ASV clearer use of _interpolate_commands.

* adopt dependabot GHA (#4568)

* Bump peter-evans/create-pull-request from 3.8.2 to 3.12.1 (#4577)

Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 3.8.2 to 3.12.1.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/052fc72b4198ba9fbc81b818c6e1859f747d49a8...f22a7da129c901513876a2380e2dae9f8e145330)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump actions/stale from 4.0.0 to 4.1.0 (#4575)

Bumps [actions/stale](https://github.com/actions/stale) from 4.0.0 to 4.1.0.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v4.0.0...v4.1.0)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump actions/script from 4 to 5.1.0 (#4576)

* gha: lockfiles labels and auto-pr details (#4578)

* Fix refresh lockfile worrkflow pull request title (#4579)

* New tool-agnostic ASV environment management (#4571)

* New tool-agnostic ASV env management.

* Benchmarking only build the latest Python.

* Increase benchmark accuracy by increasing rounds.

* Fix ASV rounds mistake.

* ASV clearer use of _interpolate_commands.

* Fix load_http bug, extend testing, and note to docs (#4580)

* Fix opendap bug, add docs and extra testing

* Add whats new entry

* Update docs/src/whatsnew/3.2.rst

Co-authored-by: Bill Little <[email protected]>

* Add warning box

Co-authored-by: Bill Little <[email protected]>

* Loading Benchmarks (#4477)

* Synthetic FF PP NetCDF and loading benchmarks.

* fix test (#4585)

* [pre-commit.ci] pre-commit autoupdate (#4587)

* [pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/psf/black: 21.12b0 → 22.1.0](https://github.com/psf/black/compare/21.12b0...22.1.0)
- [github.com/asottile/blacken-docs: v1.12.0 → v1.12.1](https://github.com/asottile/blacken-docs/compare/v1.12.0...v1.12.1)
- [github.com/aio-libs/sort-all: v1.1.0 → v1.2.0](https://github.com/aio-libs/sort-all/compare/v1.1.0...v1.2.0)

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* Finalise whatsnew and version string update (#4588)

* docs linkcheck skip (#4590)

* Add missing commit to v3.2.x and update version number (#4593)

* fix trove classifier (#4324)

* update version to 3.2. post release

Co-authored-by: Bill Little <[email protected]>

* Bump actions/script from 5.1.0 to 6 (#4586)

Bumps [actions/script](https://github.com/actions/script) from 5.1.0 to 6.
- [Release notes](https://github.com/actions/script/releases)
- [Commits](https://github.com/actions/script/compare/v5.1.0...v6)

---
updated-dependencies:
- dependency-name: actions/script
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Yaml fixes + clarifications. (#4594)

* Yaml fixes + clarifications.

* Update .github/workflows/stale.yml

Co-authored-by: Ruth Comer <[email protected]>

Co-authored-by: Bill Little <[email protected]>
Co-authored-by: Ruth Comer <[email protected]>

* Overnight benchmarks (#4583)

* Utility class in netcdf loader should not be public. (#4592)

* Utility class in netcdf loader should not be public.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Rename container for better clarity.

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* Stop using nc_time_axis.CalendarDateTime (#4584)

* stop using CalendarDateTime

* update dependencies

* stronger tests for _fixup_dates

* add whatsnew

* Update 3.2.rst whats new with section for bug fixes (#4604)

* Bump peter-evans/create-pull-request from 3.12.1 to 3.13.0 (#4607)

Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 3.12.1 to 3.13.0.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/f22a7da129c901513876a2380e2dae9f8e145330...89265e8d24a5dea438a2577fdc409a11e9f855ca)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Support false-easting and false-northing when loading Mercator-projected data (#4524)

* Add extra pieces to get false easting and northing

* tests

* Add extra test file ref and cml

* lib/iris/tests/results/netcdf/netcdf_merc_false.cml

* Update cml for new test data

* Bump test data version for cirrus

* What's new

* Bump peter-evans/create-pull-request from 3.13.0 to 3.14.0 (#4608)

Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 3.13.0 to 3.14.0.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/89265e8d24a5dea438a2577fdc409a11e9f855ca...18f7dc018cc2cd597073088f7c7591b9d1c02672)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Revert plotting-vs-y (#4601)

* revert plotting-vs-y

* whatsnew

* Bump actions/stale from 4.1.0 to 5 (#4612)

Bumps [actions/stale](https://github.com/actions/stale) from 4.1.0 to 5.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v4.1.0...v5)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump actions/checkout from 2 to 3 (#4611)

Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Use crs.globe in _crs_distance_differentials() (#4605)

* Use crs.globe in _crs_distance_differentials(), add a relevant test, update whatsnew

* add a ref to the issue and PR

* add dennis (#4614)

* Final offline benchmark migration (#4562)

* Overnight benchmarks remove ambiguity between file and commit names. (#4620)

* purge deploy key (#4615)

* Remove no_clobber task from Refresh lockfiles Action (#4618)

* Remove no_clobber task from Refresh lockfiles Action

* review actions - add extra infor to pr message

* Scalar Scatter Plot (#4616)

* add failing test

* pass test

* initial review actions

* test 2nd arg scalar

* whatsnew

* Updated environment lockfiles (#4624)

Co-authored-by: Lockfile bot <[email protected]>

* Overnight benchmarks - find a valid issue assignee (#4627)

* Overnight benchmarks find a valid issue assignee.

* Overnight benchmarks safer check for a valid issue assignee.

* Votable Issues (#4617)

* Create test2.yml

* gha test

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* Update refresh-votable-issues.yml

* initial

* tidy

* updated whatsnew

* removed defunct ext links

* Update docs/src/votable_issues.rst

Co-authored-by: Ruth Comer <[email protected]>

* added suggestion to subscribe to voted issues.

* Renamed votable to voted.  Layout tweaks to the voted issues page.

Co-authored-by: Ruth Comer <[email protected]>

* Avoid dimensionality mismatch between data array and CF variables. (#4610)

* Sperf & Cperf Benchmarks (#4621)

* Update version to 3.2.1 and fix whatsnew (#4635)

* Improve Small Benchmark Accuracy (#4636)

* Remove another memory benchmark that's smaller than the noise level.

* Fixed import benchmarks.

* Updated GHA frequency and table name for Voted Issues (#4641)

* updated gha frequency and table name

* added new ignore for linkcheck

* use conda-lock -k explicit (#4644)

* Bump actions/cache from 2 to 3 (#4650)

Bumps [actions/cache](https://github.com/actions/cache) from 2 to 3.
- [Release notes](https://github.com/actions/cache/releases)
- [Commits](https://github.com/actions/cache/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump peter-evans/create-pull-request from 3.14.0 to 4 (#4652)

Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 3.14.0 to 4.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/18f7dc018cc2cd597073088f7c7591b9d1c02672...d6d5519d05f5814158ef015b8448f2f74648c421)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Fix aggregated_by mdtol/masked constant problem (#4246)

* add failing test

* pass test

* whatsnew

* remove redundant copy call

* Make iris.tests.stock.simple_1d respect bounds arg (#4658)

* Make iris.tests.stock.simple_1d respect bounds arg

* What's new

* What's new

* Improved check for valid user in overnight BM run. (#4659)

* Preserve position when replacing Axes with GeoAxes (#4273)

* preserve position

* add test

* comment to clarify test

* whatsnew

* use original position

* Lazy Percentile Aggregator (#3901)

* implement lazy percentile

* fix map_complete_blocks tests

* fix legacy masked type no mask tests

* add test for map_complete_blocks on dask array

* handle axis expressed as sequence

* fix docstring

* add lazy_aggregate method and mdtol handling

* reshape for multi-dim collapse

* mdtol handling for added trailing dimension

* update aggregator instance docstring

* simplify array reshape

* factor out array reshaping as decorator

* reduce repetition in tests

* PERCENTILE multi-axis tests

* add tests for array wrangling

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* py3.7

* test_PERCENTILE.py tweaks

* cut down post_process tests

* clarify wrapper tests

* whatsnew

* revert py3.7 change

* Update lib/iris/analysis/__init__.py

Co-authored-by: Will Benfold <[email protected]>

* review: remove docstring kwarg; define _real_percentile

* review: blank line for note

* review: remove scalar_percent check

* review: test__axis_to_single_trailing.py

* review: simplify structure

* review: _percentile docstring args

* review: remove axis description from _percentile docstring

* review: don't use rollaxis

* review: generalize LazyMixin to also work for non-lazy.  Rename

* review: move Test_lazy_aggregate tests into MaskedCalcMixin

* review: generalise MaskedCalcMixin

* review: remove stray as_lazy_data calls

* review: use mixins for Test_aggregate

* review: move multi axis tests to their own mixin

* review: use MultiAxisMixin in both lazy classes

* review: add tests for fast real aggregation

* docstrings

* review: test clarity tweaks

* review: test alphap, betap passed to scipy

* review: use assertEqual

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Will Benfold <[email protected]>

* Fix nearest_neighbour_index for edge case where requested point is float and bounds are int (#4245)

* add failing test

* pass test

* add whatsnew

* Include note to strip out Artifactory (#4666)

* Include note to strip out Artifactory

* What's new

* update black (#4668)

* Fixed cube arithmetic for cubes with meshes. (#4651)

* Use separate cml files for tests/unit/analysis/maths/test_slice multiple passes.

* Roughly functional, but lots of tests to fix.

* Fix

* Fix mockist test for new-style Resolve.  Mesh support not yet tested.

* Fix _create_prepared_item when points/bounds passed in.

* --no-edit

* Simplify prepared-item usage.

* Added tests

* Added whatsnew.

* Reference Iris issues for outstanding problems.

* Small simplifications.

* Updated statement on cube arithmetic with meshes.

* Fix use of 'MathsAddOperationMixin'; add coord-mismatch tests on meshcubes.

* Review changes.

* Hack test which was failing.

* Updated environment lockfiles (#4655)

Co-authored-by: Lockfile bot <[email protected]>

* 'Deep' benchmarks to catch scaling with field count (#4654)

* 'Deep' benchmarks to catch scaling with field count

* Better sized benchmarks

* What's new

* Update benchmarks/benchmarks/load/__init__.py

Co-authored-by: Martin Yeo <[email protected]>

Co-authored-by: Martin Yeo <[email protected]>

* Automatic reversal of DimCoord bounds (#4466)

* first pass at ensuring contiguous bounds

* reduce scope and fix old tests

* bounds setter tests

* test contiguity preserved

* check bounds within reverse tests

* add comment; merge test

* simpler approach

* revert now redundant changes

* update cml

* cell equality to ignore bound order

* update cml

* move merge test to integration

* review: simple actions

* review: split up cube reverse tests

* review: check bounds in all cube reverse tests

* whatsnew

* review: reduce test repetition

* tweak whatsnew

* blank line

* Updated environment lockfiles (#4677)

Co-authored-by: Lockfile bot <[email protected]>

* Updated environment lockfiles (#4678)

Co-authored-by: Lockfile bot <[email protected]>

* Reorder Constraints sections of user guide, add time bounds example (#4656)

* move constraint detail to subsetting cube, add example of constraining bound

* Add whats new

* Bump peter-evans/create-pull-request from 4.0.0 to 4.0.1 (#4675)

Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 4.0.0 to 4.0.1.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/d6d5519d05f5814158ef015b8448f2f74648c421...f1a7646cead32c950d90344a4fb5d4e926972a8f)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* tweak whatsnew (#4682)

* Implement Pydata theme (#4661)

* new theme baseline

* update

* added discussion directive and whatsnew

* fixed bullet point indentation

* updated NOX_CACHE_BUILD to force update the nox cache

* added pr ref

* Update lock-file generation in response to conda-lock change

* Make lockfile shareable and bump nox cache

* MAin branch updates to latest.rst (from dev.rst)

* change references of dev.rst to latest.rst

* corrected bullet points indentation to render correctly.

* updated

* update whatsnew

* Review action and fixed typo for link

* update lock

* updated from main

Co-authored-by: Will Benfold <[email protected]>
Co-authored-by: Bill Little <[email protected]>

* Update percentile tests (#4684)

* update percentile tests

* review action

* Updated environment lockfiles (#4685)

Co-authored-by: Lockfile bot <[email protected]>

* Bump actions/download-artifact from 2 to 3 (#4686)

Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 2 to 3.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump actions/upload-artifact from 2 to 3 (#4687)

Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 2 to 3.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump peter-evans/create-pull-request from 4.0.1 to 4.0.2 (#4688)

Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 4.0.1 to 4.0.2.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/f1a7646cead32c950d90344a4fb5d4e926972a8f...bd72e1b7922d417764d27d30768117ad7da78a0e)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Add dynamic matrix to refresh lockfile job (#4573)

* Add dynamic matrix to refresh lockfile job

* review actions

* added link check and ensured https use (#4694)

* [pre-commit.ci] pre-commit autoupdate (#4691)

updates:
- [github.com/pre-commit/pre-commit-hooks: v4.1.0 → v4.2.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.1.0...v4.2.0)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* Comment rendering (#4689)

* used numpy docstrings to fix docs rendering

* comment rejig

* apply numpydoc strings

* corrected notes

* updated docstring guidance.

* added explicit mention of numpydoc strings

* added whatsnew

* added whatsnew PR ref

* Update lib/iris/fileformats/nimrod_load_rules.py

Co-authored-by: Will Benfold <[email protected]>

* Update docs/src/whatsnew/latest.rst

Co-authored-by: Will Benfold <[email protected]>

* review actions.

Co-authored-by: Will Benfold <[email protected]>

* Updated environment lockfiles (#4696)

Co-authored-by: Lockfile bot <[email protected]>

* Cache regular points generation (#4698)

* Cache regular points generation

* Move func to util

* Just apply lru_cache to the function once

* What's new

* Git ignore the benchmarks data folder (#4699)

* Git ignore the benchmarks data folder

* Update path and description

* Catch `AttributeError` from removing `CFReader._dataset` when it doesn't exist (#4646)

* Implement full Mercator parameter support (#4609)

* Changes to coord_systems

* Finish feature

* Define both standard_parallel and scale_factor... but leave one None

* Initial test changes

* Test updates and additions

* New expected test outputs

* What's new and test data version bump

* Review fix

* Edit the right file

* Updated environment lockfiles (#4706)

Co-authored-by: Lockfile bot <[email protected]>

* Add evertrol to whatsnew of #4646 given #4705 (#4709)

* Add `iris.analysis.MAX_RUN` aggregator (#4676)

* Failing tests

* Start with the tests

* Draft implementation

* Test results

* Account for masked data and multiple axes

* Testing, bug fixes

* Reduce duplication

* Update .cml and fix test failures

* Don't use map_complete_blocks

* Use dask versions of functions

* Test and fix masked data handling

* Use da.from_array instead of as_lazy_data

* Test chunking, fix dask.array import

* Restore _lazy_data.py as we're not using those changes

* credit Will's epic review (#4711)

* add bullet (#4715)

* Weighted `aggregated_by` (#4589)

* First suggestion for weighted aggregated_by

* Added lazy weighted aggregation

* Added first tests for weighted aggregated_by

* Added further tests and allowed returned kwarg

* Added unit tests for weighted aggregated_by

* Moved _get_aggregator_fn to iris.analyis

* Reused 'returned' keyword

* Added test for lazy output if 'returned' is used

* Removed checksum=False from tests

* Expanded test for lazy aggregation since PERCENTILE is lazy now

* Added schlunma to common links

* Addaux speedup (#4718)

* Attempt faster add-aux-fact

* Added whatsnew draft.

* Put PR ref into whatsnew.

* Review changes.

* Remove time_return benchmarks. (#4717)

* Credit reviewer in what's new contributions. (#4705)

* Credit reviewer in what's new contributions.

* Correct example link in what's new docs.

Co-authored-by: Will Benfold <[email protected]>

Co-authored-by: Will Benfold <[email protected]>

* Change Cell equality to equate nans (fixes #4681) (#4701)

* nans in cells satisfy equality

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* address review comments

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* Netcdf saving: workaround known netcdf bug. (#4407)

* Netcdf saving: workaround known netcdf bug.

* Fix netcdf dim renaming for anonymous dims.

* Fixes to test-mesh generation to preserve save-load roundtrips.

* Added tests for all the different places where code was fixed.

* Tidy some formatting and comments.

* Fix rebase error?

* Review changes.

* Updated environment lockfiles (#4724)

Co-authored-by: Lockfile bot <[email protected]>

* MAX_RUN into docs (#4726)

* Datum support in Iris (#4704)

* Support in helpers

* coord_systems changes

* More additions

* Revert some FUTURE guards and condense datum application

* Fixing tests and improving

* More additions

* Tests pass

* transform_points test

* Review fixes

* In datums, unknown means None

* Fix test

* Suppress FutureWarning in the tests that were failing due to it

* Review fixes

* What's new

* Extra test result

* Bump peter-evans/create-pull-request from 4.0.2 to 4.0.3 (#4733)

Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 4.0.2 to 4.0.3.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/bd72e1b7922d417764d27d30768117ad7da78a0e...f094b77505fb89581e68a1163fbd2fffece39da1)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Updated environment lockfiles (#4732)

Co-authored-by: Lockfile bot <[email protected]>

* Replace nose with pytest (#4734)

* Replace nose with pytest

* Reinstate magic processor number

* add psutil, fstrings and rename TestMixin

* Caching during load (#4716)

* Caching

* Move _optimum_chunksize docstring

* Should be copying coords because they're mutable

* Handle failure of datetime comparisons gracefully

* Review fixes and more careful checks on mutable objects

* coord_system doesn't have 'copy' but __repr__ covers the whole thing (I think)

* Review fixes

* Revert coord_system changes

* Still need to handle tuple issue

* What's new

* Fix prompted by test failure

* Limit cache size

* Work around comparable datetime issue

* More sensible climatological time points (#4723)

* Initial moves to introduce result_coord_func

* climatological keyword

* Climatology argument to aggregated_by

* Fix the tests

* Review changes from RC

* Test fixes

* Further test fixes

* Move test code back out after rebase

* Different fix for self.coord_dims failure

* Add ifmain

* Revert inadvertent doctest changes

* Review improvements

* Fix doctest black broke

* Stop new tests being executable, which makes the test runner miss them

* Docstrings to comments so they don't obscure test names in results

* Apply suggestions from code review

Co-authored-by: Ruth Comer <[email protected]>

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Review fixes

* What's new

Co-authored-by: Ruth Comer <[email protected]>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* Remove Mule monkey patch. (#4738)

* climatology doc tweak (#4740)

* Mesh docs - include examples of converting different mesh formats. (#4739)

* Mesh docs - include examples of converting different mesh formats.

* SMC mesh example fix gotcha.

* Add sample images to mesh conversion examples.

* Mesh conversion examples - fix bullet points.

* Mesh conversion examples - print meshes.

* Whats New entry.

* Mesh conversion examples - more detailed comments.

* Gallery: update NEMO example (#4741)

* update nemo example

* clearer comment

* fixed numbered list entry (#4743)

* Plotting circular data extends args as well as the data (#4649)

* Extend any kwarg array

* Add test

* Add comments and update imagerepo.json

* Try using the value as an array, in case it's been given as a list etc.

* What's new

* Datum performance improvements (#4731)

* Set stacklevel to get more useful FutureWarning

* Remove spare printing

* Only generate crs and globe on demand, handle attr setting

* Updates docstrings to make it clearer what's going on

* Additional tests (and fixes found from testing)

* Warn that inverse_flattening setting doesn't help

* Updated environment lockfiles (#4742)

Co-authored-by: Lockfile bot <[email protected]>

* Extra datum translation (#4753)

* Updated environment lockfiles (#4760)

Co-authored-by: Lockfile bot <[email protected]>

* Permit fast percentile with mdtol=0 (#4755)

* Permit fast percentile with mdtol=0

* What's new

* Check arrays like they're masked, and make the expected arrays masked

* Bigger arrays to avoid np quirk, bug fix, check masking in 2d_multi

* Suppress numpy masked percentile warning

* Use a larger test array that numpy handles how it handles most of them (the worse case)

* Broadcast the mask in the non-lazy case with added dim

* Bug fix on ndim test

* Review fixes

* Credit @rcomer on PR #4755 review (#4761)

* CPerf and SPerf Benchmark Fixes (#4758)

* CSPerf fixes.

* Correct argument hashing in file names.

* Warn if BENCHMARK_DATA is not set.

* SPerf combine_regions better file handling.

* SPerf don't store FileMixin files long term - too much space.

* More realistic SPerf file sizes, allow larger-than-memory files.

* Add SPerf comment about total disk space.

* Corrected CSPerf directories printout.

* Remove namespace conflict in SPerf combine_regions.

* don't use np.float or np.int (#4763)

* Test warnings (#4764)

* import from collections.abc

* deprecated csr module

* unittest deprecations

* random_integers -> randint

* collections again

* inspect deprecation

* reduce redunancy

* non test class

* Increase speed of iris.analysis.trajectory.interpolate with linear interpolation (#4366)

* Interpolate all points at once rather than sequentially

* This splits the internals of cube.interpolate in an effort not to make so much superfluous data, but is slow

* Generate the extra values then discard them, but with minimal looping

* Updated docstrings to clarify behaviour

* Benchmarks for trajectory (linear and nearest neighbour)

* Update error thrown for aux coord over interpolated and uninterpolated dimensions, and add unit tests

* Update cml

* What's new has moved

* What's new fix for rebase

* Prevent truncation of cell method descriptions with nested brackets (#4436)

* Add failing test for brackets within comments

* Fix test

* Separate private function now splits the cell method before it's parsed

* Add additional failing test for multiple axis methods

* Handle multiple axis cell methods

* Update docstring to reflect eventual choices

* Add warnings to function, and test them

* Significantly simpler warning checks

* Developer documentation on available testing conveniences (#4600)

* Developer documentation on available testing conveniences

* what's new

* Update to be easily usable without code links working

* Rebase

* Cubelist contain only cubes -- resurrected (#4767)

* ensure cubelists only contain cubes

* address __iadd__ and __setitem__

* __setitem__ tests

* test for setting more than 1 item

* Fix __setitem__ and Py2 tweaks

* implement __setslice__ for Python2.7

* change exceptions to warnings

* stickler

* duck type check; move helpers outside class

* blank lines

* proposed: revert warnings to exceptions

* remove stray extra 'test_fail'

* pass sequences through __init__; _assert_is_cube

* Replace CubeList init with new. Cube testing duck-type.

* Review change.

* Provide new-style whatsnew.

* Fix whatsnew

Co-authored-by: Ruth Comer <[email protected]>

* Updated environment lockfiles (#4775)

Co-authored-by: Lockfile bot <[email protected]>

* Redirect whatsnew to latest (#4727)

* Redirect whatsnew

* Get the top bar working too

* Clean build with right links

* Update release docs

* Review fixes

* update section name for clarity

* Bump peter-evans/create-pull-request from 4.0.3 to 4.0.4 (#4783)

Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 4.0.3 to 4.0.4.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/f094b77505fb89581e68a1163fbd2fffece39da1...923ad837f191474af6b1721408744feb989a4c27)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Updated environment lockfiles (#4782)

Co-authored-by: Lockfile bot <[email protected]>

* Fix whatsnew (#4784)

* Fix whatsnew

* Instead of changing 3.0.rst, rename 'whatsnew.rst' to 'index.rst'

* Missed one

* `PolarStereographic` implementation (#4773)

* PolarStereographic implementation

* Test data version

* What's new

* Accept suggestion to lib/iris/coord_systems.py

Co-authored-by: Patrick Peglar <[email protected]>

* Permit Stereographic saving

* Update what's new

* Review fixes

Co-authored-by: Patrick Peglar <[email protected]>

* Add mesh details to cube printout. (#4778)

* Slightly refactor repr-html code to rationalise section handling.

* Test repr-html of string attributes.

* Add mesh details to cube printout.

* Update meshcube printouts in docs.

* Add Mesh section to repr-html.

* Review change : make test clearer.

* Review change : fix string truncation/quoting.

* Retire use of the New labels. (#4801)

* pinned pydata-sphinx-theme until the docs are dark mode friendly. (#4796)

* adopt ci gha (#4503)

* adopt ci gha

* bump iris-test-data to latest version

* ci noxify

* remove dummy cache key name

* remove precommit nox task

* added whatsnew entry

* remove mpl cfg for linkcheck

* trial composite nox-cache

* composite iris-data-cache action

* composite conda-env-cache action

* composite conda-pkg-cache action

* composite cartopy-cache action

* required lock-file composite action input

* review action

* review action

* nox inputs.lock_file

* env_name composite action input

* replace HOME with tilde usage

* cancel in-progress workflow jobs

* refresh-lockfiles gha note

* Scripted Logo Generation, take two (#3935)

* Added logo generation Python script.

* Replace lambda scale_func.n

* Matched current logo appearance.

* Simplified gradient code.

* Renamed land_mask to land_clip.

* Make new svg instead of faffing with reformatting existing.

* Refactor out 'style' in attributes.

* File header.

* Integrated logo generation script into Sphinx docs generation.

* Environment variable logo names.

* Removed banner width calculation to avoid font dependency.

* Refactored to also generate rotating logos.

* Replace plt.tightlayout with plt.subplots_adjust.

* Replaced OrderedDicts with dicts (not needed >=Py3.6).

* Numpy standard import form.

* Replaced animated SVG with precusor files for animated GIF.

* Corrected logo URL to source from ReadTheDocs site.

* Changes to better match 'hand-created' logo.

* Fixed logo rotate zip title.

* Relocated logo generation script to SciTools/marketing.

* update links (#3942)

* update links

* added s to http

* Added logo generation Python script.

* Replace lambda scale_func.n

* Matched current logo appearance.

* Simplified gradient code.

* Renamed land_mask to land_clip.

* Make new svg instead of faffing with reformatting existing.

* Refactor out 'style' in attributes.

* File header.

* Integrated logo generation script into Sphinx docs generation.

* Environment variable logo names.

* Removed banner width calculation to avoid font dependency.

* Refactored to also generate rotating logos.

* Replace plt.tightlayout with plt.subplots_adjust.

* Replaced OrderedDicts with dicts (not needed >=Py3.6).

* Numpy standard import form.

* Replaced animated SVG with precusor files for animated GIF.

* Corrected logo URL to source from ReadTheDocs site.

* Changes to better match 'hand-created' logo.

* Fixed logo rotate zip title.

* Relocated logo generation script to SciTools/marketing.

* Include version string in logo generation.

* Reference official logo generation code.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Fix README docs reference.

* Include the logos, don't generate on the fly.

Co-authored-by: Ruth Comer <[email protected]>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix composite gha (#4809)

* fix composite gha

* bump gha cache_build to force purge

* Whats new entry for SVG logo. (#4810)

* Updated environment lockfiles (#4815)

Co-authored-by: Lockfile bot <[email protected]>

* add gha workflow badges (#4813)

* address npy disable cpu features warning (#4811)

* Ensure tests use ncgen/ncdump from the Python env; rationalise uses of ncgen. (#4794)

* Ensure tests use ncgen/ncdump from the Python env; rationalise uses of ncgen a bit.

* Tidy some imports.

* Rationalise use of ncgen and avoid subprocess 'shell=True'.

* Review changes: revert to importing iris.tests first.

* Tidy routines slightly.

* Fix subprocess call.

* Added whatsnew.

* Limit memory benchmark result to 5Mb minimum (#4818)

* docs: cirrus-ci to gha (#4821)

* docs: cirrus-ci to gha

* review actions

* Stereographic load with scale factor (#4785)

* Allow passing of method keyword to numpy.percentile (#4791)

* allow passing of method keyword to numpy.percentile

* review actions

* pass all kwargs

* fix doc kwargs

* Update image testing (#4759)

* Use images from test data

* Bug fixes and docs

* Include circular plot image

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Oops, missed it. There now

* Update test data version

* Update __all__

* Type hinting

* No underscore

* Join strings

* Other underscores

* Other test data version location

* Doc fixes

* Imagerepo refresh info

* Move the lock

* Fix refs

* Remove image index (as it's now in the test data index)

* Fix the json test

* Revert pillow pin removal to separate concerns

* Update imagerepo for test that passes with penultimate val

* Second imagerepo update

* Third set of imagerepo changes

* Fourth imagerepo changes (gallery test)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* whatnew for #4791 (#4823)

* bump ci to latest iris-test-data version (#4825)

* auto generate gha auth token (#4817)

* auto generate gha auth token

* add docs for github app config

* linkcheck ignore metarelate.net

* remove metarelate URL whatsnew reference

* Fix stock CDL headers for unlimited time dimension. (#4827)

* Fix CDL headers for tests.stock.netcdf.

* Whats new entry.

* Improved unlimited dimension check in stock NetCDF generation.

* Whatsnew minor fix (#4829)

* Update latest.rst

* PR link

* add issue link

* Updated environment lockfiles (#4831)

Co-authored-by: Lockfile bot <[email protected]>

* rationalise doctests gha (#4819)

* rationalise doctests gha

* update job name with session

* add nox session as composite input

* minor tweak

* review action - tidy nox composite inputs

* Remove pin, update hashes, improve script (#4826)

* Remove pin, update hashes, improve script

* What's new

* Lockfile and whatsnew

* Shareable urls

* Later lockfile

* Shareable...

* Check for consistency before fiddling

* Updates for new test data (idiff'ed)

* Keep lockstep between imagerepo and data

* idiff always runs after imagerepo.json has been updated anyway

* Gallery test updates (also idiff'd)

* Update test data version

* Implement `iris.plot.fill_between` (#4647)

* Remove pin, update hashes, improve script

* What's new

* Lockfile and whatsnew

* Shareable urls

* Later lockfile

* Shareable...

* Check for consistency before fiddling

* Updates for new test data (idiff'ed)

* Keep lockstep between imagerepo and data

* idiff always runs after imagerepo.json has been updated anyway

* Gallery test updates (also idiff'd)

* Implement fill_between and write tests

* Simplify error check

* Test images

* What's new

* Image test results

* Fix error message

* Pre-emptive test data version update

Co-authored-by: Bill Little <[email protected]>

* Python 3.9 CI & Combine CI workflows (#4832)

* combine ci workflows

* remove badge

* ci unpin python

* post #4759 review actions (#4833)

* pytest less verbose (#4837)

* Remove redundant testing assert methods (#4838)

* remove assertWarnsRegexp

* remove assertStringEqual

* post rebase tidyings

* whatsnew

* NetCDF Generation Adjustments (#4836)

* remove pillow pin from setup.cfg (#4839)

* Support python 3.10 (#4840)

* extend ci support for py310

* fix Cell.__hash__ py310 nan behaviour

* review actions

* update github app docs (#4844)

* Lockfile update and Gregorian to Standard calendar change (#4847)

* sed gregorian

* sed CALENDAR_GREGORIAN

* rename cml files

* revert whatsnew 2.1 and test_cf.py

* revert spelling_allow

* post rebase sed 'gregorian'

* Updated environment lockfiles

* cf-units minimum pin

* review actions

Co-authored-by: Lockfile bot <[email protected]>

* Updated environment lockfiles (#4850)

Co-authored-by: Lockfile bot <[email protected]>

* avoid setuptools deprecation (#4848)

* [pre-commit.ci] pre-commit autoupdate (#4851)

updates:
- [github.com/pre-commit/pre-commit-hooks: v4.2.0 → v4.3.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.2.0...v4.3.0)
- [github.com/psf/black: 22.3.0 → 22.6.0](https://github.com/psf/black/compare/22.3.0...22.6.0)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* Alternative Cell.__hash__ implementation for NaN support (#4852)

* Alternative Cell.__hash__ implementation for NaN support

* add whatsnew entry

* whatsnew update (#4853)

* adopt setuptools-scm for auto versioning (#4841)

* adopt setuptools-scm for auto versioning

* update py310.yml requirements

* update locks

* simplify docs version

* update dev release docs

* update .gitignore for vscode

* update locks

* add exclude _version.py to MANIFEST.in

* review actions

* update lock files

* update pyproject.toml

* what a whatsnew entry

* fix rtd version (#4855)

* Updated environment lockfiles (#4858)

Co-authored-by: Lockfile bot <[email protected]>

* pytest verbosity (#4861)

* Updated environment lockfiles (#4867)

Co-authored-by: Lockfile bot <[email protected]>

* Recommend `pytest` in developer guide (#4866)

* recommend pytest

* pros and cons

* tweaks

* add missing skips (#4865)

* Updated environment lockfiles (#4873)

Co-authored-by: Lockfile bot <[email protected]>

* Replace testing helper function (#4878)

* replace unmasked_data_as_1d_array

* whatsnew

* Cube arithmetic array type handling (#3790)

* add new tests; fix existing tests

* force lhs lazy if rhs lazy

* black

* add in-place tests

* add handling for unmasked, masked real array combo

* add tests for false skeleton

* rearrange _math_op_common if-loops

* revert maths.py to upstream/master

* simpler solution

* reduce masking arithmetic tests

* expand and improve tests

* add whatsnew

* fix rebase snafu

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* update following numpy#21977

* Revert "update following numpy#21977"

This reverts commit 7d62ad6b8779129b9f4c2f7d26f070f5402f95e9.

* update comment

* a before b

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* automate sdist and wheel build and publish (#4849)

* automate sdist and wheel build and publish

* update names

* tidy package manifest and discovery

* add note to dev docs

* update MANIFEST.in

* Update .github/workflows/ci-wheels.yml

Co-authored-by: Martin Yeo <[email protected]>

* add unshallow comment to rtd

* reinstate docs release

* add pypa build comment

* test wheel

* added whatnew + tweak nox wheel emsgs

* Update docs/src/developers_guide/release.rst

Co-authored-by: Martin Yeo <[email protected]>

* Warn users of increased `recombine_submeshes` memory demand. (#4881)

* Warn users of increased recombine_submeshes memory demand.

* Clearer what's new entry.

* Sphinx reset modules (#4885)

* fix sphinx-gallery

* change gallery index reference

* Updated environment lockfiles (#4884)

Co-authored-by: Lockfile bot <[email protected]>

* [pre-commit.ci] pre-commit autoupdate (#4886)

updates:
- [github.com/PyCQA/flake8: 4.0.1 → 5.0.2](https://github.com/PyCQA/flake8/compare/4.0.1...5.0.2)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix percentile docstring (#4888)

* [pre-commit.ci] pre-commit autoupdate (#4895)

updates:
- [github.com/PyCQA/flake8: 5.0.2 → 5.0.4](https://github.com/PyCQA/flake8/compare/5.0.2...5.0.4)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* Upgrade `iris.util.mask_cube` (#4889)

* rewrite mask_cube

* fix import problems

* simplify _unmask_mask and its tests

* parametrize not in place 1d _mask_array

* pytest in-place _mask_array tests

* pytest _mask_array broadcasting tests

* remove iris.tests from test__mask_array

* attempt to preserve metadata

* pull masked array assertions off test class

* pytestify test__unmask_mask.py

* remove _unmask_mask; tweak test

* numpydoc docstring

* add CML checks

* preserve cube.metadata; add final CML

* path handling

* get hold of _mask_array result

Co-authored-by: Bill Little <[email protected]>

* more thorough in_place check

Co-authored-by: Bill Little <[email protected]>

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* review actions

* whatsnew

Co-authored-by: Bill Little <[email protected]>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* set default 'unknown' version (#4892)

* Prevent color bar from being misplaced (#4894)

* Prevent color bar from being misplaced

Currently, if `plt.gca()` gives a different Axes object than `axes` in the function `_label`, the color bar will be malpositioned, ending up either on another subfigure, or in another figure window altogether. Specifying the `ax` argument when calling `plt.colorbar` prevents this.

* add whatsnew and test coverage

* check axes and figure

* tidy and add extra axes2 test

Co-authored-by: Bill Little <[email protected]>

* Lockfile update and skip questionable test (#4901)

* Updated environment lockfiles

* skip questionable test

Co-authored-by: Lockfile bot <[email protected]>

* Adapt to the latest setuptools editable configuration. (#4903)

* Adapt to the latest setuptools editable configuration.

* What's new entry.

* What's new typo.

* Update setuptools in Conda requirements.

* pytest gallery tests (#4792)

* pytest parametrize gallery tests

* two context managers as fixtures

* use pathlib instead of os

* docstrings

* use pytest.mark.filterwarnings

* show_replaced_by_check_graphic as fixture

* Revert previous (more readable without)

This reverts commit bdca27cd301fff9de034f14db9da991dac43facf.

* gallery_dir function to variable

* add setup/teardown fixture

* tweak docstring

* remove gallerytests from Makefile

* update dev guide

* doc tweaks

* use monkeypatch to simplify

* move stuff about

* monkeypatch for sys.path; comments and param ids

* revert assert False

* revert deliberate fails

* import_patches fixture

* post rebase check_graphic fix

* update test references

* whatsnew

* test data version

* Updated environment lockfiles (#4904)

Co-authored-by: Lockfile bot <[email protected]>

* Revert Cell.__hash__ fix (#4874)

* Revert Cell.__hash__ fix

* add whatsnew entry

* update comments

* Revert #4701 cell nan equality

Co-authored-by: lbdreyer <[email protected]>

* Add whats new entry for 4734 (#4908)

* Extend new_axis to reshape _DimensionalMetadata objects (#4896)

* extend iris.util.new_axis

* add tests

* fix tests

* Rewrite new_axis; extra stock cube; cube _dimensional_metadata utility and tests

* Add new_axis tests

* Convert to pytest

* Rename broadcast -> expand; review actions

* Add whatsnew entry

Co-authored-by: stephen.worsley <[email protected]>

* Standard names table update (v79) (#4910)

* update cf standard name table

* add whatsnew

* fix whatsnew

* Pin shapely (#4911)

* pin shapely

* update whatsnew

* Improvements to Pandas-to-Iris bridge (#4890)

* First pass using merge to parse ndim Pandas DataFrame.

* Second pass actually doing array manipulation this time.

* Tidying for public consumption.

* Improved index handling.

* Pytest conversion.

* Minor re-factoring.

* Support for copy argument.

* Calendar handling.

* Correct coord reshaping.

* Correct array indexing.

* DataFrame Series agnosticism.

* Docstrings and structure.

* Error as_cube if FUTURE behaviour is set.

* Tests WIP.

* More tests.

* Completed tests.

* Suppress deprecation warning in TestSeriesAsCube.

* Docstring corrections.

* Another docstring fix.

* Another docstring fix.

* Another docstring fix.

* Doctests.

* Doctests.

* Strict expectation of one Cube in tests.

* format_dimensional_metadata typo.

* Rename pandas_array to pandas_structure.

* Leaner warnings for Series with column arguments.

* Fix date tests.

* Back out pandas_ndim FUTURE flag.

* Uncomment code, whoops.

* What's new entry.

* Remove erroneous pass.

* Doctest typo.

* Handle an empty Pandas structure.

* Test showing that dimension order is preserved.

* Informative error for ragged indexes.

* Include shapely pin in setup.cfg (#4917)

* Include shapely pin in setup.cfg.

* What's new entry.

* update whatsnew (#4914)

* Avoid using mutable default. (#4918)

* Fix some @trexfeathers What's New entries (#4920)

* Minor What's New fixes.

* Missing space.

* Update whatsnew for v3.3.0rc0 (#4921)

* update whatsnew

* fix index

* remove template

* address review comments

* Updated environment lockfiles (#4923)

Co-authored-by: Lockfile bot <[email protected]>

* Update whatsnew (#4924)

* reset whatsnew

* remove bugfix section

* address review comments

* Bump peter-evans/create-pull-request from 4.0.4 to 4.1.1 (#4922)

Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 4.0.4 to 4.1.1.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/923ad837f191474af6b1721408744feb989a4c27...18f90432bedd2afd6a825469ffd38aa24712a91d)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Tilde's and wildcard recognition within iris.save. (#4913)

* Draft: Tilde's and wildcard can now be read by iris.save. Modifications and tests provisionally done, docstrings still need editing, with examples and doctests needing being added/editing.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Docstrings updated for expand_filespecs and save

* docstrings for save and expand_filespecs updated to numpy formatting

* Reviewed: Added expansion and relative path tests to expand_filespecs. Ensured list indexing returns single item lists. Minor comment changes.

* Updated latest What's New, and added ESadek-MO to common links

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Fixed isort conflicts

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* Unpin shapely (#4925)

* unpin shapely

* update whatsnew

* SUM, COUNT, PROPORTION: don't use dask on numpy arrays (#4905)

* COUNT

* SUM

* tidy up

* increase dask min pin

* fix returned weights when masked

* typo

* docstrings

* whatsnew

* include reviewer in whatsnew

* Remove `setUpClass` from Iris tests. (#4927)

* remove IrisTest.setUpClass

* whatsnew

* Better handle `setuptools_scm` versioning (#4926)

* Use setuptools_scm release-branch-semver version_scheme.

* Properly handle all possible scm-rtd combinations.

* What's new entry.

* Use git stash to protect setuptools_scm from RTD.

* Better version badges.

* Better use of git stash.

* Substitute commit SHAs in place of versions where appropriate.

* Make rtd_version safe for use in shields.io badges.

* Make rtd_version safe for use in shields.io badges.

* Allowed collapsing coordinates with `nbounds != (0, 2)` (#4870)

* Allowed collapsing over coordinates with nbounds!=0,2

* Simplified test

* Added further tests for other warnings

* pre-commit

* Used unittest's assertWarnsRegex

* Added What's new? entry

* fix whatsnew (#4932)

* Updated environment lockfiles (#4936)

Co-authored-by: Lockfile bot <[email protected]>

* update whatsnew title for v3.3 release (#4939)

* Added zonal mean gallery example, continued from @TTV-Intrepid (#4935)

* Added zonal mean gallery example, continued from @TTV-Intrepid

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Added TTVIntrepid to common links for What's New functionality

* Fixed zonal mean plotting, add axh

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Minor visual changes, ax3 plotting fix, removed warning suppression.

* updated imagerepo for zonal means

* updated ci-tests yml to latest iris test data version

* updated what's new

* updated announcements to one line

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* [pre-commit.ci] pre-commit autoupdate (#4942)

updates:
- [github.com/psf/black: 22.6.0 → 22.8.0](https://github.com/psf/black/compare/22.6.0...22.8.0)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* Remove deprecated 'python setup.py test' support (#4948)

* Remove deprecated 'python setup.py test' support

* add whatsnew entry

* purge unused setup clean_source custom command (#4949)

* purge unnecessary setup.py copy_copyright function (#4950)

* fix setup.py std_names building (#4952)

* fix setup.py std_names building

* refactor

* docs whatsnew entry updates (#4953)

* Fix cube repr for scalar anc_var and cell measures (#4945)

* Fix cube repr for scalar anc_var and cell measures

* Add whatsnew

* Fix cube summary tests

* Review actions: reword whats new, reorder scalar sections in cube printout

* Fix cube summary test, update whatsnew

* Fix code comment

* update pypi trove classifiers (#4954)

* Add new Q+A issue, update author email

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Bill Little <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Lockfile bot <[email protected]>
Co-authored-by: Martin Yeo <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Bill Little <[email protected]>
Co-authored-by: Ruth Comer <[email protected]>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Patrick Peglar <[email protected]>
Co-authored-by: Will Benfold <[email protected]>
Co-authored-by: Denis Sergeev <[email protected]>
Co-authored-by: tkknight <[email protected]>
Co-authored-by: Will Benfold <[email protected]>
Co-authored-by: Manuel Schlund <[email protected]>
Co-authored-by: stephenworsley <[email protected]>
Co-authored-by: Ruth Comer <[email protected]>
Co-authored-by: iris-actions[bot] <107775138+iris-actions[bot]@users.noreply.github.com>
Co-authored-by: scitools-ci[bot] <107775138+scitools-ci[bot]@users.noreply.github.com>
Co-authored-by: Kristofer Krus <[email protected]>
Co-authored-by: stephen.worsley <[email protected]>
Co-authored-by: Elias <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Performance Shift(s): 44fae030

3 participants