Thanks to visit codestin.com
Credit goes to github.com

Skip to content

[Agentic] Design spec: making merge and concatenate robust, efficient and configurable - #7274

Merged
bjlittle merged 8 commits into
SciTools:greenfieldfrom
bjlittle:merge-concat-design
Sep 10, 2026
Merged

[Agentic] Design spec: making merge and concatenate robust, efficient and configurable#7274
bjlittle merged 8 commits into
SciTools:greenfieldfrom
bjlittle:merge-concat-design

Conversation

@bjlittle

@bjlittle bjlittle commented Sep 10, 2026

Copy link
Copy Markdown
Member

Description

This pull request adds the agreed design spec for a programme of work to make
CubeList.merge and CubeList.concatenate more robust, efficient, configurable,
extensible, lazy and lenient — plus the small amount of Sphinx plumbing needed to
publish specs at all.

It contains no library code changes. Nothing in lib/iris/ is touched. The
purpose is to get the design in front of core developers before any
implementation lands, so the shape of the programme can be argued with while it
is still cheap to change.

What the spec proposes

Twelve small, independently reviewable pull requests. Each is either a
behaviour-preserving refactor or a standalone user-visible improvement, and
together they grow a shared substrate beneath the two engines — without anyone
having to agree to a rewrite up front. §6 is the live roadmap and will be updated
as each one lands; it also carries the assumptions and open decisions, each owned
by the PR that has to resolve it. §10 records the questions the programme raises
but does not answer.

Issues in scope: #2761 (separability), #5375 (diagnostics),
#6790 (merge/concatenate asymmetry), #7063 / #7241
(performance), and parts of #4446 / #5392 (leniency).

The alternative that was considered and rejected — specify a unified v4.0 engine
first, then build it — is preserved rather than discarded, at
bjlittle#333, with §4.3 recording why it is not
the starting point.

Reviewer notes

Three things worth knowing before you open the diff:

  1. AGENTS.md shows ~214 changed lines, but almost all of it is reflow. The
    file carries its own 200-line budget, so adding three sections meant
    compacting what was already there. The genuinely new content is: the
    "Documentation" paragraphs on where specs and plans live, "Lock-file
    Maintenance", and "Contribution Workflow". The rest is the same rules, said
    shorter. Reviewing the three new sections and skimming the reflow is a
    reasonable use of your time; reading all 214 lines is not.
  2. myst-parser is a new documentation dependency. Specs are MyST Markdown;
    everything else in docs/ stays reStructuredText, and conf.py says so. The
    lock files are edited minimally — new package URLs plus input_hash — rather
    than fully re-solved, following the precedent of DOCS: Support for generating LLM friendy summary for the docs. #7095 and DOCS: Add sitemap support #7100,
    so this does not bundle ~90 unrelated version bumps into a docs PR.
  3. Plans are tracked but unpublished. docs/src/developers_guide/plans/ is
    excluded from the Sphinx build via exclude_patterns: a spec is a living
    document, a plan is frozen once its PR merges, and only the former belongs on
    the rendered site.

Docs build clean — the 6 remaining warnings are all pre-existing SKIP_API=1
artefacts. pre-commit run --all-files passes.

Why this targets greenfield

The programme is long-running and deliberately incremental, so its parts should
land together as a coherent tranche rather than trickling into main one at a
time. greenfield was created for exactly this work.


🤖 Attribution

This pull request is agentic work. It was researched, written and committed
by Claude Opus 5 working with @bjlittle, who
directed the investigation, made every design decision put to him, and reviewed
the result before it was raised. The commits carry Co-Authored-By trailers
saying the same.

Being explicit about this is the point rather than a formality — part of what
this programme is testing is whether agentic contributions can be made reviewable
enough to be worth a core developer's time. Please review it at least as
sceptically as you would any other pull request. If the answer turns out to be
no, that is a useful result and we would rather hear it early.

Design decisions in the spec are @bjlittle's; errors in how they are written up
are Claude's.

Checklist

  • Included a What's New entry — changelog/7274.doc.rst and
    changelog/7274.dependency.rst
  • Incorporated type hints in any changed code — n/a, no library code changed
  • Checked if tests need updating — none needed; no behaviour changes
  • Checked if benchmarks need updating — none needed here (the spec's PR 3
    extends the merge benchmark, deliberately kept separate)
  • Checked if documentation needs updating — this PR is documentation
  • Checked if dependencies need updating — myst-parser added to
    requirements/py31{2,3,4}.yml and the matching lock files
  • Confirmed that the GitHub 'checks' on this PR are passing

@github-actions github-actions Bot added benchmark_this Request that this pull request be benchmarked to check if it introduces performance shifts and removed Feature: Merge/Concatenate Type: Feature Branch Highlight this for a feature branch Agentic labels Sep 10, 2026
bjlittle and others added 7 commits September 10, 2026 21:23
Specifies a twelve-PR programme to make cube merge and concatenate more
robust, efficient, configurable, extensible, lazy and lenient, without a
rewrite. Each PR is either a behaviour-preserving refactor or a standalone
user-visible improvement; together they grow a shared substrate beneath
both engines.

Includes a confirmed diagnosis and fix for the separability bug open since
2017 (SciTools#2761), verified end-to-end against the reporter's case.

Co-Authored-By: Claude Opus 5 <[email protected]>
Adopt the spec/plan convention used in bjlittle/tephpy.

Agreed design specs now live in `docs/src/developers_guide/specs/` and are
published as part of the documentation.  They are written in MyST Markdown,
are living documents revised as a design evolves, and each declares a
citation prefix so its sections can be cited from issues and pull requests.

Implementation plans live in the sibling `docs/src/developers_guide/plans/`.
A plan is point-in-time and frozen once its pull request merges, so plans are
tracked in the repository but excluded from the Sphinx build.

This requires `myst-parser`, added to `requirements/py*.yml` and inserted into
the three lock files following the precedent of SciTools#7095 and SciTools#7100.  Markdown is
used only for specs; all other documentation remains reStructuredText.

The merge/concatenate design spec moves here from `docs/superpowers/specs/`
and is reworked to the new conventions.

Co-Authored-By: Claude Opus 5 <[email protected]>
The spec described a twelve-PR programme but had nowhere to record how far
it had got, which assumptions it rested on, or what it had left open.

Restructure §6 from a static table of work into the programme's live
progress record: dependencies as a partial order rather than a chain, a
status vocabulary, an "Outside the roadmap" list, and a numbered register
of assumptions and open decisions - each item owned by the pull request
that must resolve it. Add §10 for the questions the programme raises but
does not answer, renumbering References to §11.

Also exclude "_build" and "_static" from the Sphinx build. myst-parser
makes ".md" a source suffix, so the README of each was being read as a
document.

Co-Authored-By: Claude Opus 5 <[email protected]>
This work is long-running partly because it is also an exercise in earning
core-developer buy-in for agentic contributions, so the mechanics of how it
reaches them are worth writing down rather than re-deciding each session.

Add a "Contribution Workflow" section to AGENTS.md carrying the general
rule: branches to the fork, pull requests to a feature branch rather than
main, honest "Agentic" labelling, clear attribution, and ask before doing
anything outward-facing when unsure. Drop the "Getting Help" link list to
stay inside the file's 200-line budget - the links it held are all reachable
from CONTRIBUTING.md.

The programme-specific parts - base branch "greenfield" and the
"Feature: Merge/Concatenate" label - go in the spec's cross-cutting rules
instead, where a reviewer can see why these pull requests do not target main.

Co-Authored-By: Claude Opus 5 <[email protected]>
The branch was cut from main at c508ac8; greenfield carries SciTools#7270 on top
of that, which re-solved all three lock files. The lock additions here are
re-derived against those fresh locks, and remain minimal - the myst-parser
dependency closure and the input_hash, nothing else.

The cube.py line references the spec cites are unaffected: SciTools#7270's changes
are confined to rolling_window, some 4500 lines below the merge and
concatenate methods.

Co-Authored-By: Claude Opus 5 <[email protected]>
@codecov

codecov Bot commented Sep 10, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 90.35%. Comparing base (253510b) to head (07c43bb).

Additional details and impacted files
@@             Coverage Diff             @@
##           greenfield    #7274   +/-   ##
===========================================
  Coverage       90.35%   90.35%           
===========================================
  Files              93       93           
  Lines           25816    25816           
  Branches         4796     4796           
===========================================
  Hits            23327    23327           
  Misses           1709     1709           
  Partials          780      780           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Give every cited section its own section sign, and separate a run of them
with a comma or a solidus rather than a dash.  A dashed range such as
"5.6-5.7" reads as a single citation carrying a stray suffix, so only its
first section is unambiguously identified -- by a reader now, and by any
cross-reference tooling later.

Records the rule on the Design Specs index page, next to the citation
prefix table it belongs with, and applies it to the one occurrence in the
merge/concatenate spec.

Co-Authored-By: Claude Opus 5 <[email protected]>
@github-actions

Copy link
Copy Markdown
Contributor

⏱️ Performance Benchmark Report: a751ecf

Performance shifts

Full benchmark results

Benchmarks that have stayed the same:

| Change   | Before [253510b3]    | After [a751ecff]    |   Ratio | Benchmark (Parameter)                                                                       |
|----------|----------------------|---------------------|---------|---------------------------------------------------------------------------------------------|
|          | 19.8±1ms             | 19.6±1ms            |    0.99 | aggregate_collapse.Aggregation.time_aggregated_by_COUNT(False)                              |
|          | 52.6±0.6ms           | 52.2±1ms            |    0.99 | aggregate_collapse.Aggregation.time_aggregated_by_COUNT(True)                               |
|          | 32.2±1ms             | 32.3±1ms            |    1    | aggregate_collapse.Aggregation.time_aggregated_by_FAST_PERCENTILE(False)                    |
|          | 176±1ms              | 174±2ms             |    0.99 | aggregate_collapse.Aggregation.time_aggregated_by_FAST_PERCENTILE(True)                     |
|          | 21.4±1ms             | 21.3±1ms            |    1    | aggregate_collapse.Aggregation.time_aggregated_by_GMEAN(False)                              |
|          | 31.4±0.4ms           | 31.8±0.6ms          |    1.01 | aggregate_collapse.Aggregation.time_aggregated_by_GMEAN(True)                               |
|          | 21.2±1ms             | 21.3±1ms            |    1.01 | aggregate_collapse.Aggregation.time_aggregated_by_HMEAN(False)                              |
|          | 31.5±0.3ms           | 31.6±0.5ms          |    1    | aggregate_collapse.Aggregation.time_aggregated_by_HMEAN(True)                               |
|          | 19.4±1ms             | 19.5±1ms            |    1.01 | aggregate_collapse.Aggregation.time_aggregated_by_MAX(False)                                |
|          | 44.4±1ms             | 43.8±1ms            |    0.99 | aggregate_collapse.Aggregation.time_aggregated_by_MAX(True)                                 |
|          | 130±2ms              | 131±2ms             |    1.01 | aggregate_collapse.Aggregation.time_aggregated_by_MAX_RUN(False)                            |
|          | 130±0.7ms            | 129±1ms             |    0.99 | aggregate_collapse.Aggregation.time_aggregated_by_MAX_RUN(True)                             |
|          | 20.2±1ms             | 20.3±1ms            |    1    | aggregate_collapse.Aggregation.time_aggregated_by_MEAN(False)                               |
|          | 48.2±1ms             | 47.2±1ms            |    0.98 | aggregate_collapse.Aggregation.time_aggregated_by_MEAN(True)                                |
|          | 21.9±2ms             | 21.8±1ms            |    1    | aggregate_collapse.Aggregation.time_aggregated_by_MEDIAN(False)                             |
|          | 56.5±1ms             | 57.7±0.6ms          |    1.02 | aggregate_collapse.Aggregation.time_aggregated_by_MEDIAN(True)                              |
|          | 19.2±1ms             | 19.1±1ms            |    0.99 | aggregate_collapse.Aggregation.time_aggregated_by_MIN(False)                                |
|          | 44.1±0.6ms           | 43.7±0.7ms          |    0.99 | aggregate_collapse.Aggregation.time_aggregated_by_MIN(True)                                 |
|          | 918±4ms              | 918±5ms             |    1    | aggregate_collapse.Aggregation.time_aggregated_by_PEAK(False)                               |
|          | 940±20ms             | 916±2ms             |    0.97 | aggregate_collapse.Aggregation.time_aggregated_by_PEAK(True)                                |
|          | 199±5ms              | 203±3ms             |    1.02 | aggregate_collapse.Aggregation.time_aggregated_by_PERCENTILE(False)                         |
|          | 337±5ms              | 330±6ms             |    0.98 | aggregate_collapse.Aggregation.time_aggregated_by_PERCENTILE(True)                          |
|          | 20.3±1ms             | 20.2±1ms            |    0.99 | aggregate_collapse.Aggregation.time_aggregated_by_PROPORTION(False)                         |
|          | 30.6±0.4ms           | 29.7±0.3ms          |    0.97 | aggregate_collapse.Aggregation.time_aggregated_by_PROPORTION(True)                          |
|          | 20.3±2ms             | 20.7±1ms            |    1.02 | aggregate_collapse.Aggregation.time_aggregated_by_RMS(False)                                |
|          | 57.7±0.6ms           | 58.8±1ms            |    1.02 | aggregate_collapse.Aggregation.time_aggregated_by_RMS(True)                                 |
|          | 21.3±1ms             | 21.1±1ms            |    0.99 | aggregate_collapse.Aggregation.time_aggregated_by_STD_DEV(False)                            |
|          | 60.2±1ms             | 60.2±0.7ms          |    1    | aggregate_collapse.Aggregation.time_aggregated_by_STD_DEV(True)                             |
|          | 21.0±1ms             | 20.9±1ms            |    0.99 | aggregate_collapse.Aggregation.time_aggregated_by_VARIANCE(False)                           |
|          | 57.3±1ms             | 56.7±1ms            |    0.99 | aggregate_collapse.Aggregation.time_aggregated_by_VARIANCE(True)                            |
|          | 7.07±0.03ms          | 7.11±0.06ms         |    1.01 | aggregate_collapse.Aggregation.time_collapsed_by_COUNT(False)                               |
|          | 22.2±0.5ms           | 22.2±0.3ms          |    1    | aggregate_collapse.Aggregation.time_collapsed_by_COUNT(True)                                |
|          | 17.7±0.1ms           | 17.7±0.1ms          |    1    | aggregate_collapse.Aggregation.time_collapsed_by_FAST_PERCENTILE(False)                     |
|          | 139±4ms              | 135±7ms             |    0.98 | aggregate_collapse.Aggregation.time_collapsed_by_FAST_PERCENTILE(True)                      |
|          | 7.35±0.06ms          | 7.33±0.05ms         |    1    | aggregate_collapse.Aggregation.time_collapsed_by_GMEAN(False)                               |
|          | 20.6±0.2ms           | 20.1±0.3ms          |    0.98 | aggregate_collapse.Aggregation.time_collapsed_by_GMEAN(True)                                |
|          | 7.47±0.06ms          | 7.43±0.03ms         |    1    | aggregate_collapse.Aggregation.time_collapsed_by_HMEAN(False)                               |
|          | 20.3±0.2ms           | 20.1±0.2ms          |    0.99 | aggregate_collapse.Aggregation.time_collapsed_by_HMEAN(True)                                |
|          | 7.01±0.06ms          | 6.96±0.04ms         |    0.99 | aggregate_collapse.Aggregation.time_collapsed_by_MAX(False)                                 |
|          | 20.9±0.2ms           | 20.8±0.3ms          |    1    | aggregate_collapse.Aggregation.time_collapsed_by_MAX(True)                                  |
|          | 24.6±1ms             | 24.5±1ms            |    0.99 | aggregate_collapse.Aggregation.time_collapsed_by_MAX_RUN(False)                             |
|          | 35.4±0.7ms           | 35.3±0.9ms          |    1    | aggregate_collapse.Aggregation.time_collapsed_by_MAX_RUN(True)                              |
|          | 7.32±0.09ms          | 7.22±0.07ms         |    0.99 | aggregate_collapse.Aggregation.time_collapsed_by_MEAN(False)                                |
|          | 21.3±0.3ms           | 21.1±0.2ms          |    0.99 | aggregate_collapse.Aggregation.time_collapsed_by_MEAN(True)                                 |
|          | 8.02±0.07ms          | 8.04±0.08ms         |    1    | aggregate_collapse.Aggregation.time_collapsed_by_MEDIAN(False)                              |
|          | 23.4±0.3ms           | 23.4±0.4ms          |    1    | aggregate_collapse.Aggregation.time_collapsed_by_MEDIAN(True)                               |
|          | 6.98±0.05ms          | 6.95±0.07ms         |    1    | aggregate_collapse.Aggregation.time_collapsed_by_MIN(False)                                 |
|          | 20.9±0.3ms           | 20.9±0.3ms          |    1    | aggregate_collapse.Aggregation.time_collapsed_by_MIN(True)                                  |
|          | 472±1ms              | 472±0.5ms           |    1    | aggregate_collapse.Aggregation.time_collapsed_by_PEAK(False)                                |
|          | 486±20ms             | 484±0.9ms           |    0.99 | aggregate_collapse.Aggregation.time_collapsed_by_PEAK(True)                                 |
|          | 41.9±0.5ms           | 41.7±0.1ms          |    0.99 | aggregate_collapse.Aggregation.time_collapsed_by_PERCENTILE(False)                          |
|          | 148±4ms              | 145±2ms             |    0.98 | aggregate_collapse.Aggregation.time_collapsed_by_PERCENTILE(True)                           |
|          | 7.27±0.04ms          | 7.25±0.08ms         |    1    | aggregate_collapse.Aggregation.time_collapsed_by_PROPORTION(False)                          |
|          | 20.4±0.2ms           | 20.1±0.3ms          |    0.99 | aggregate_collapse.Aggregation.time_collapsed_by_PROPORTION(True)                           |
|          | 7.37±0.05ms          | 7.35±0.05ms         |    1    | aggregate_collapse.Aggregation.time_collapsed_by_RMS(False)                                 |
|          | 22.7±0.3ms           | 22.6±0.2ms          |    1    | aggregate_collapse.Aggregation.time_collapsed_by_RMS(True)                                  |
|          | 7.56±0.05ms          | 7.48±0.05ms         |    0.99 | aggregate_collapse.Aggregation.time_collapsed_by_STD_DEV(False)                             |
|          | 22.4±0.4ms           | 22.4±0.4ms          |    1    | aggregate_collapse.Aggregation.time_collapsed_by_STD_DEV(True)                              |
|          | 7.70±0.1ms           | 7.63±0.06ms         |    0.99 | aggregate_collapse.Aggregation.time_collapsed_by_VARIANCE(False)                            |
|          | 22.0±0.2ms           | 22.2±0.3ms          |    1.01 | aggregate_collapse.Aggregation.time_collapsed_by_VARIANCE(True)                             |
|          | 20.9±1ms             | 20.5±1ms            |    0.98 | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_MEAN(False)                     |
|          | 82.7±0.7ms           | 82.1±0.7ms          |    0.99 | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_MEAN(True)                      |
|          | 20.7±1ms             | 20.5±1ms            |    0.99 | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_RMS(False)                      |
|          | 94.9±1ms             | 93.1±1ms            |    0.98 | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_RMS(True)                       |
|          | 19.9±1ms             | 19.6±1ms            |    0.98 | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_SUM(False)                      |
|          | 53.9±1ms             | 53.3±0.7ms          |    0.99 | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_SUM(True)                       |
|          | 7.77±0.07ms          | 7.65±0.07ms         |    0.99 | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_MEAN(False)                      |
|          | 27.6±0.6ms           | 27.0±0.8ms          |    0.98 | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_MEAN(True)                       |
|          | 7.59±0.06ms          | 7.45±0.06ms         |    0.98 | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_RMS(False)                       |
|          | 29.2±0.9ms           | 29.0±0.8ms          |    0.99 | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_RMS(True)                        |
|          | 7.29±0.05ms          | 7.24±0.1ms          |    0.99 | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_SUM(False)                       |
|          | 23.0±0.4ms           | 22.7±0.3ms          |    0.99 | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_SUM(True)                        |
|          | 170±1ms              | 170±0.9ms           |    1    | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_WPERCENTILE(False)               |
|          | 253±10ms             | 251±2ms             |    0.99 | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_WPERCENTILE(True)                |
|          | 1.10±0.01ms          | 1.09±0.01ms         |    1    | cube.CubeCreation.time_create(False, 'construct')                                           |
|          | 443±5μs              | 450±9μs             |    1.02 | cube.CubeCreation.time_create(False, 'instantiate')                                         |
|          | 1.73±0.01ms          | 1.74±0.02ms         |    1.01 | cube.CubeCreation.time_create(True, 'construct')                                            |
|          | 1.23±0.01ms          | 1.24±0.01ms         |    1.01 | cube.CubeCreation.time_create(True, 'instantiate')                                          |
|          | 113±2ms              | 115±3ms             |    1.01 | cube.CubeEquality.time_equality(False, False, 'all_equal')                                  |
|          | 26.4±1ms             | 26.4±2ms            |    1    | cube.CubeEquality.time_equality(False, False, 'coord_inequality')                           |
|          | 139±3ms              | 138±2ms             |    0.99 | cube.CubeEquality.time_equality(False, False, 'data_inequality')                            |
|          | 73.9±2μs             | 74.3±2μs            |    1.01 | cube.CubeEquality.time_equality(False, False, 'metadata_inequality')                        |
|          | 118±3ms              | 115±1ms             |    0.98 | cube.CubeEquality.time_equality(False, True, 'all_equal')                                   |
|          | 29.0±0.8ms           | 29.4±0.7ms          |    1.01 | cube.CubeEquality.time_equality(False, True, 'coord_inequality')                            |
|          | 140±2ms              | 140±2ms             |    1    | cube.CubeEquality.time_equality(False, True, 'data_inequality')                             |
|          | 79.1±6μs             | 76.0±2μs            |    0.96 | cube.CubeEquality.time_equality(False, True, 'metadata_inequality')                         |
|          | 209±6ms              | 205±5ms             |    0.98 | cube.CubeEquality.time_equality(True, False, 'all_equal')                                   |
|          | 74.8±2ms             | 74.9±1ms            |    1    | cube.CubeEquality.time_equality(True, False, 'coord_inequality')                            |
|          | 255±3ms              | 252±10ms            |    0.99 | cube.CubeEquality.time_equality(True, False, 'data_inequality')                             |
|          | 80.5±2μs             | 82.4±2μs            |    1.02 | cube.CubeEquality.time_equality(True, False, 'metadata_inequality')                         |
|          | 293±6ms              | 287±6ms             |    0.98 | cube.CubeEquality.time_equality(True, True, 'all_equal')                                    |
|          | 159±6ms              | 153±5ms             |    0.96 | cube.CubeEquality.time_equality(True, True, 'coord_inequality')                             |
|          | 339±3ms              | 331±6ms             |    0.98 | cube.CubeEquality.time_equality(True, True, 'data_inequality')                              |
|          | 349±7μs              | 356±6μs             |    1.02 | cube.CubeEquality.time_equality(True, True, 'metadata_inequality')                          |
|          | 859±10μs             | 859±10μs            |    1    | import_iris.Iris.time__concatenate                                                          |
|          | 164±3μs              | 162±2μs             |    0.99 | import_iris.Iris.time__constraints                                                          |
|          | 88.5±1μs             | 88.1±2μs            |    0.99 | import_iris.Iris.time__data_manager                                                         |
|          | 73.2±0.2μs           | 73.2±0.2μs          |    1    | import_iris.Iris.time__deprecation                                                          |
|          | 130±2μs              | 129±1μs             |    1    | import_iris.Iris.time__lazy_data                                                            |
|          | 950±10μs             | 954±10μs            |    1    | import_iris.Iris.time__merge                                                                |
|          | 52.5±0.4μs           | 53.0±0.3μs          |    1.01 | import_iris.Iris.time__representation                                                       |
|          | 676±10μs             | 676±10μs            |    1    | import_iris.Iris.time_analysis                                                              |
|          | 102±1μs              | 100±0.9μs           |    0.99 | import_iris.Iris.time_analysis__area_weighted                                               |
|          | 87.7±0.6μs           | 87.6±0.6μs          |    1    | import_iris.Iris.time_analysis__grid_angles                                                 |
|          | 248±3μs              | 245±4μs             |    0.99 | import_iris.Iris.time_analysis__interpolation                                               |
|          | 162±2μs              | 161±2μs             |    0.99 | import_iris.Iris.time_analysis__regrid                                                      |
|          | 80.7±0.3μs           | 81.4±0.4μs          |    1.01 | import_iris.Iris.time_analysis__scipy_interpolate                                           |
|          | 98.4±1μs             | 101±1μs             |    1.02 | import_iris.Iris.time_analysis_calculus                                                     |
|          | 325±3μs              | 325±3μs             |    1    | import_iris.Iris.time_analysis_cartography                                                  |
|          | 65.7±0.3μs           | 65.1±0.4μs          |    0.99 | import_iris.Iris.time_analysis_geomerty                                                     |
|          | 181±2μs              | 179±1μs             |    0.99 | import_iris.Iris.time_analysis_maths                                                        |
|          | 67.5±0.2μs           | 67.3±0.1μs          |    1    | import_iris.Iris.time_analysis_stats                                                        |
|          | 140±3μs              | 140±2μs             |    1    | import_iris.Iris.time_analysis_trajectory                                                   |
|          | 317±6μs              | 321±7μs             |    1.01 | import_iris.Iris.time_aux_factory                                                           |
|          | 57.6±0.2μs           | 57.7±0.1μs          |    1    | import_iris.Iris.time_common                                                                |
|          | 131±2μs              | 133±2μs             |    1.02 | import_iris.Iris.time_common_lenient                                                        |
|          | 1.50±0.03ms          | 1.53±0.02ms         |    1.02 | import_iris.Iris.time_common_metadata                                                       |
|          | 148±5μs              | 149±3μs             |    1    | import_iris.Iris.time_common_mixin                                                          |
|          | 1.19±0.01ms          | 1.17±0.02ms         |    0.99 | import_iris.Iris.time_common_resolve                                                        |
|          | 206±2μs              | 206±2μs             |    1    | import_iris.Iris.time_config                                                                |
|          | 96.8±1μs             | 96.1±0.7μs          |    0.99 | import_iris.Iris.time_coord_categorisation                                                  |
|          | 384±5μs              | 375±1μs             |    0.98 | import_iris.Iris.time_coord_systems                                                         |
|          | 892±10μs             | 896±10μs            |    1    | import_iris.Iris.time_coords                                                                |
|          | 870±20μs             | 875±20μs            |    1.01 | import_iris.Iris.time_cube                                                                  |
|          | 223±2μs              | 213±5μs             |    0.96 | import_iris.Iris.time_exceptions                                                            |
|          | 53.1±0.2μs           | 53.0±0.3μs          |    1    | import_iris.Iris.time_experimental                                                          |
|          | 142±1μs              | 143±0.8μs           |    1.01 | import_iris.Iris.time_fileformats                                                           |
|          | 251±5μs              | 252±6μs             |    1    | import_iris.Iris.time_fileformats__ff                                                       |
|          | 2.77±0.2ms           | 3.04±0.2ms          |    1.09 | import_iris.Iris.time_fileformats__ff_cross_references                                      |
|          | 56.5±0.2μs           | 56.8±0.1μs          |    1.01 | import_iris.Iris.time_fileformats__pp_lbproc_pairs                                          |
|          | 81.9±0.4μs           | 82.0±0.5μs          |    1    | import_iris.Iris.time_fileformats_abf                                                       |
|          | 450±7μs              | 459±4μs             |    1.02 | import_iris.Iris.time_fileformats_cf                                                        |
|          | 3.84±0.1ms           | 3.96±0.1ms          |    1.03 | import_iris.Iris.time_fileformats_dot                                                       |
|          | 52.9±0.1μs           | 52.8±0.2μs          |    1    | import_iris.Iris.time_fileformats_name                                                      |
|          | 242±3μs              | 240±3μs             |    0.99 | import_iris.Iris.time_fileformats_name_loaders                                              |
|          | 86.2±1μs             | 86.6±1μs            |    1    | import_iris.Iris.time_fileformats_netcdf                                                    |
|          | 120±0.4μs            | 121±1μs             |    1.01 | import_iris.Iris.time_fileformats_nimrod                                                    |
|          | 305±2μs              | 306±3μs             |    1.01 | import_iris.Iris.time_fileformats_nimrod_load_rules                                         |
|          | 855±20μs             | 843±20μs            |    0.99 | import_iris.Iris.time_fileformats_pp                                                        |
|          | 138±3μs              | 138±1μs             |    1    | import_iris.Iris.time_fileformats_pp_load_rules                                             |
|          | 94.0±0.7μs           | 93.8±1μs            |    1    | import_iris.Iris.time_fileformats_pp_save_rules                                             |
|          | 548±5μs              | 549±5μs             |    1    | import_iris.Iris.time_fileformats_rules                                                     |
|          | 210±4μs              | 212±3μs             |    1.01 | import_iris.Iris.time_fileformats_structured_array_identification                           |
|          | 57.8±0.3μs           | 57.6±0.3μs          |    1    | import_iris.Iris.time_fileformats_um                                                        |
|          | 119±0.4μs            | 118±1μs             |    1    | import_iris.Iris.time_fileformats_um__fast_load                                             |
|          | 104±1μs              | 105±2μs             |    1    | import_iris.Iris.time_fileformats_um__fast_load_structured_fields                           |
|          | 53.5±0.1μs           | 53.6±0.2μs          |    1    | import_iris.Iris.time_fileformats_um__ff_replacement                                        |
|          | 57.5±0.09μs          | 57.2±0.1μs          |    1    | import_iris.Iris.time_fileformats_um__optimal_array_structuring                             |
|          | 1.01±0.01ms          | 1.03±0.01ms         |    1.02 | import_iris.Iris.time_fileformats_um_cf_map                                                 |
|          | 101±0.7μs            | 100±1μs             |    1    | import_iris.Iris.time_io                                                                    |
|          | 146±2μs              | 146±1μs             |    1    | import_iris.Iris.time_io_format_picker                                                      |
|          | 149±1μs              | 148±2μs             |    1    | import_iris.Iris.time_iris                                                                  |
|          | 93.6±0.6μs           | 93.8±0.5μs          |    1    | import_iris.Iris.time_iterate                                                               |
|          | 29.8±0.1ms           | 30.0±0.2ms          |    1.01 | import_iris.Iris.time_palette                                                               |
|          | 1.82±0.08ms          | 1.93±0.2ms          |    1.06 | import_iris.Iris.time_plot                                                                  |
|          | 230±30μs             | 225±20μs            |    0.98 | import_iris.Iris.time_quickplot                                                             |
|          | 2.24±0.06ms          | 2.30±0.2ms          |    1.03 | import_iris.Iris.time_std_names                                                             |
|          | 1.68±0.01ms          | 1.70±0ms            |    1.01 | import_iris.Iris.time_symbols                                                               |
|          | 266±1ms              | 266±5ms             |    1    | import_iris.Iris.time_tests                                                                 |
|          | 172±1μs              | 171±0.5μs           |    0.99 | import_iris.Iris.time_third_party_cartopy                                                   |
|          | 4.91±0.08ms          | 5.12±0.09ms         |    1.04 | import_iris.Iris.time_third_party_cf_units                                                  |
|          | 82.2±0.3μs           | 82.2±0.2μs          |    1    | import_iris.Iris.time_third_party_cftime                                                    |
|          | 2.44±0.02ms          | 2.44±0.05ms         |    1    | import_iris.Iris.time_third_party_matplotlib                                                |
|          | 557±2μs              | 559±1μs             |    1    | import_iris.Iris.time_third_party_numpy                                                     |
|          | 120±0.7μs            | 121±0.8μs           |    1.01 | import_iris.Iris.time_third_party_scipy                                                     |
|          | 73.9±0.7μs           | 73.7±0.6μs          |    1    | import_iris.Iris.time_time                                                                  |
|          | 877±6μs              | 884±10μs            |    1.01 | import_iris.Iris.time_util                                                                  |
|          | 60.4±0.5μs           | 60.3±0.4μs          |    1    | iterate.IZip.time_izip                                                                      |
|          | 9.68±0.2ms           | 9.43±0.09ms         |    0.97 | load.LoadAndRealise.time_load((1280, 960, 5), False, 'FF')                                  |
|          | 17.7±0.1ms           | 17.4±0.2ms          |    0.99 | load.LoadAndRealise.time_load((1280, 960, 5), False, 'NetCDF')                              |
|          | 9.59±0.1ms           | 9.46±0.2ms          |    0.99 | load.LoadAndRealise.time_load((1280, 960, 5), False, 'PP')                                  |
|          | 9.58±0.1ms           | 9.44±0.2ms          |    0.99 | load.LoadAndRealise.time_load((1280, 960, 5), True, 'FF')                                   |
|          | 14.5±0.2ms           | 13.8±0.4ms          |    0.95 | load.LoadAndRealise.time_load((1280, 960, 5), True, 'NetCDF')                               |
|          | 9.51±0.1ms           | 9.34±0.2ms          |    0.98 | load.LoadAndRealise.time_load((1280, 960, 5), True, 'PP')                                   |
|          | 1.36±0.01s           | 1.40±0s             |    1.03 | load.LoadAndRealise.time_load((2, 2, 1000), False, 'FF')                                    |
|          | 13.3±0.2ms           | 12.9±0.3ms          |    0.97 | load.LoadAndRealise.time_load((2, 2, 1000), False, 'NetCDF')                                |
|          | 1.34±0s              | 1.35±0.01s          |    1.01 | load.LoadAndRealise.time_load((2, 2, 1000), False, 'PP')                                    |
|          | 1.36±0.02s           | 1.36±0s             |    1    | load.LoadAndRealise.time_load((2, 2, 1000), True, 'FF')                                     |
|          | 13.2±0.2ms           | 13.0±0.1ms          |    0.99 | load.LoadAndRealise.time_load((2, 2, 1000), True, 'NetCDF')                                 |
|          | 1.34±0s              | 1.34±0s             |    1    | load.LoadAndRealise.time_load((2, 2, 1000), True, 'PP')                                     |
|          | 4.97±0.1ms           | 4.94±0.09ms         |    0.99 | load.LoadAndRealise.time_load((50, 50, 2), False, 'FF')                                     |
|          | 13.1±0.09ms          | 12.9±0.2ms          |    0.99 | load.LoadAndRealise.time_load((50, 50, 2), False, 'NetCDF')                                 |
|          | 5.13±0.2ms           | 4.82±0.09ms         |    0.94 | load.LoadAndRealise.time_load((50, 50, 2), False, 'PP')                                     |
|          | 5.14±0.09ms          | 5.00±0.2ms          |    0.97 | load.LoadAndRealise.time_load((50, 50, 2), True, 'FF')                                      |
|          | 13.0±0.2ms           | 12.9±0.1ms          |    0.99 | load.LoadAndRealise.time_load((50, 50, 2), True, 'NetCDF')                                  |
|          | 4.91±0.1ms           | 4.87±0.1ms          |    0.99 | load.LoadAndRealise.time_load((50, 50, 2), True, 'PP')                                      |
|          | 35.6±1ms             | 34.3±1ms            |    0.97 | load.LoadAndRealise.time_realise((1280, 960, 5), False, 'FF')                               |
|          | 36.8±0.4ms           | 36.8±0.6ms          |    1    | load.LoadAndRealise.time_realise((1280, 960, 5), False, 'NetCDF')                           |
|          | 19.0±2ms             | 18.3±2ms            |    0.96 | load.LoadAndRealise.time_realise((1280, 960, 5), False, 'PP')                               |
|          | 39.7±2ms             | 39.7±1ms            |    1    | load.LoadAndRealise.time_realise((1280, 960, 5), True, 'FF')                                |
|          | 71.4±0.4ms           | 70.8±0.5ms          |    0.99 | load.LoadAndRealise.time_realise((1280, 960, 5), True, 'NetCDF')                            |
|          | 39.2±1ms             | 38.5±2ms            |    0.98 | load.LoadAndRealise.time_realise((1280, 960, 5), True, 'PP')                                |
|          | 581±7ms              | 575±4ms             |    0.99 | load.LoadAndRealise.time_realise((2, 2, 1000), False, 'FF')                                 |
|          | 3.81±0.1ms           | 3.87±0.09ms         |    1.01 | load.LoadAndRealise.time_realise((2, 2, 1000), False, 'NetCDF')                             |
|          | 583±3ms              | 577±8ms             |    0.99 | load.LoadAndRealise.time_realise((2, 2, 1000), False, 'PP')                                 |
|          | 596±4ms              | 591±6ms             |    0.99 | load.LoadAndRealise.time_realise((2, 2, 1000), True, 'FF')                                  |
|          | 3.76±0.06ms          | 3.85±0.1ms          |    1.02 | load.LoadAndRealise.time_realise((2, 2, 1000), True, 'NetCDF')                              |
|          | 590±5ms              | 594±5ms             |    1.01 | load.LoadAndRealise.time_realise((2, 2, 1000), True, 'PP')                                  |
|          | 2.33±0.09ms          | 2.35±0.07ms         |    1.01 | load.LoadAndRealise.time_realise((50, 50, 2), False, 'FF')                                  |
|          | 3.90±0.1ms           | 3.72±0.2ms          |    0.95 | load.LoadAndRealise.time_realise((50, 50, 2), False, 'NetCDF')                              |
|          | 2.34±0.09ms          | 2.24±0.05ms         |    0.96 | load.LoadAndRealise.time_realise((50, 50, 2), False, 'PP')                                  |
|          | 2.32±0.1ms           | 2.31±0.08ms         |    1    | load.LoadAndRealise.time_realise((50, 50, 2), True, 'FF')                                   |
|          | 3.92±0.1ms           | 3.85±0.1ms          |    0.98 | load.LoadAndRealise.time_realise((50, 50, 2), True, 'NetCDF')                               |
|          | 2.29±0.07ms          | 2.30±0.1ms          |    1    | load.LoadAndRealise.time_realise((50, 50, 2), True, 'PP')                                   |
|          | 350±3ms              | 347±1ms             |    0.99 | load.ManyCubes.time_many_cube_load                                                          |
|          | 88.9±0.3ms           | 87.6±0.4ms          |    0.99 | load.ManyVars.time_many_var_load                                                            |
|          | 9.55±0.04ms          | 9.49±0.3ms          |    0.99 | load.STASHConstraint.time_stash_constraint((1280, 960, 5), 'FF')                            |
|          | 9.58±0.2ms           | 9.62±0.07ms         |    1    | load.STASHConstraint.time_stash_constraint((1280, 960, 5), 'PP')                            |
|          | 1.38±0.01s           | 1.37±0s             |    0.99 | load.STASHConstraint.time_stash_constraint((2, 2, 1000), 'FF')                              |
|          | 1.36±0s              | 1.35±0s             |    1    | load.STASHConstraint.time_stash_constraint((2, 2, 1000), 'PP')                              |
|          | 4.91±0.1ms           | 5.00±0.07ms         |    1.02 | load.STASHConstraint.time_stash_constraint((2, 2, 2), 'FF')                                 |
|          | 4.67±0.02ms          | 4.76±0.1ms          |    1.02 | load.STASHConstraint.time_stash_constraint((2, 2, 2), 'PP')                                 |
|          | 8.70±0.2ms           | 8.79±0.2ms          |    1.01 | load.StructuredFF.time_structured_load((1280, 960, 5), False)                               |
|          | 5.35±0.2ms           | 5.18±0.2ms          |    0.97 | load.StructuredFF.time_structured_load((1280, 960, 5), True)                                |
|          | 1.35±0.02s           | 1.35±0.02s          |    1    | load.StructuredFF.time_structured_load((2, 2, 1000), False)                                 |
|          | 372±1ms              | 370±2ms             |    0.99 | load.StructuredFF.time_structured_load((2, 2, 1000), True)                                  |
|          | 4.15±0.06ms          | 4.22±0.05ms         |    1.02 | load.StructuredFF.time_structured_load((2, 2, 2), False)                                    |
|          | 3.95±0.1ms           | 3.94±0.2ms          |    1    | load.StructuredFF.time_structured_load((2, 2, 2), True)                                     |
|          | 147±0.4ms            | 146±0.7ms           |    0.99 | load.TimeConstraint.time_time_constraint(20, 'FF')                                          |
|          | 15.6±0.2ms           | 15.8±0.2ms          |    1.01 | load.TimeConstraint.time_time_constraint(20, 'NetCDF')                                      |
|          | 144±0.6ms            | 144±0.5ms           |    1    | load.TimeConstraint.time_time_constraint(20, 'PP')                                          |
|          | 29.6±0.4ms           | 30.0±0.2ms          |    1.01 | load.TimeConstraint.time_time_constraint(3, 'FF')                                           |
|          | 15.3±0.2ms           | 15.6±0.3ms          |    1.02 | load.TimeConstraint.time_time_constraint(3, 'NetCDF')                                       |
|          | 29.6±0.3ms           | 29.4±0.2ms          |    0.99 | load.TimeConstraint.time_time_constraint(3, 'PP')                                           |
|          | 20.4±0.5ms           | 20.2±0.3ms          |    0.99 | load.ugrid.BasicLoading.time_load_file(1)                                                   |
|          | 51.8±1ms             | 52.9±0.9ms          |    1.02 | load.ugrid.BasicLoading.time_load_file(200000)                                              |
|          | 10.2±0.6ms           | 10.3±0.5ms          |    1.01 | load.ugrid.BasicLoading.time_load_mesh(1)                                                   |
|          | 20.1±0.6ms           | 20.6±0.5ms          |    1.02 | load.ugrid.BasicLoading.time_load_mesh(200000)                                              |
|          | 20.5±0.6ms           | 20.9±0.8ms          |    1.02 | load.ugrid.BasicLoadingTime.time_load_file(1)                                               |
|          | 20.6±0.4ms           | 21.1±0.5ms          |    1.03 | load.ugrid.BasicLoadingTime.time_load_file(200000)                                          |
|          | 10.2±0.5ms           | 10.3±0.4ms          |    1    | load.ugrid.BasicLoadingTime.time_load_mesh(1)                                               |
|          | 13.9±0.3ms           | 14.1±0.2ms          |    1.01 | load.ugrid.BasicLoadingTime.time_load_mesh(200000)                                          |
|          | 22.0±0.8ms           | 22.3±0.5ms          |    1.02 | load.ugrid.Callback.time_load_file_callback(1)                                              |
|          | 63.5±2ms             | 65.4±2ms            |    1.03 | load.ugrid.Callback.time_load_file_callback(200000)                                         |
|          | 22.0±0.5ms           | 22.6±0.6ms          |    1.03 | load.ugrid.CallbackTime.time_load_file_callback(1)                                          |
|          | 24.3±0.5ms           | 24.0±0.6ms          |    0.99 | load.ugrid.CallbackTime.time_load_file_callback(200000)                                     |
|          | 3.84±0.09ms          | 3.87±0.1ms          |    1.01 | load.ugrid.DataRealisation.time_realise_data(10000)                                         |
|          | 6.04±0.1ms           | 6.03±0.1ms          |    1    | load.ugrid.DataRealisation.time_realise_data(200000)                                        |
|          | 53.1±2ms             | 54.3±3ms            |    1.02 | load.ugrid.DataRealisationTime.time_realise_data(10000)                                     |
|          | 1.07±0.03s           | 1.07±0.03s          |    1    | load.ugrid.DataRealisationTime.time_realise_data(200000)                                    |
|          | 1.40±0.01s           | 1.41±0.01s          |    1    | merge_concat.Concatenate.time_concatenate(False)                                            |
|          | 430±5ms              | 426±3ms             |    0.99 | merge_concat.Concatenate.time_concatenate(True)                                             |
|          | 2.21±0G              | 2.21±0G             |    1    | merge_concat.Concatenate.tracemalloc_concatenate(False)                                     |
|          | 71.7±2M              | 71.7±2M             |    1    | merge_concat.Concatenate.tracemalloc_concatenate(True)                                      |
|          | 59.4±1ms             | 57.6±2ms            |    0.97 | merge_concat.Merge.time_merge                                                               |
|          | 126±0.03M            | 126±0.03M           |    1    | merge_concat.Merge.tracemalloc_merge                                                        |
|          | 5.31±0.03ms          | 5.33±0.05ms         |    1    | mesh.utils.regions_combine.CombineRegionsComputeRealData.time_compute_data(50)              |
|          | 151±3ms              | 148±2ms             |    0.98 | mesh.utils.regions_combine.CombineRegionsComputeRealData.time_compute_data(500)             |
|          | 770±3k               | 769±3k              |    1    | mesh.utils.regions_combine.CombineRegionsComputeRealData.tracemalloc_compute_data(50)       |
|          | 60.2±0M              | 60.2±0M             |    1    | mesh.utils.regions_combine.CombineRegionsComputeRealData.tracemalloc_compute_data(500)      |
|          | 17.9±0.2ms           | 18.0±0.2ms          |    1.01 | mesh.utils.regions_combine.CombineRegionsCreateCube.time_create_combined_cube(50)           |
|          | 23.6±0.3ms           | 23.9±0.4ms          |    1.01 | mesh.utils.regions_combine.CombineRegionsCreateCube.time_create_combined_cube(500)          |
|          | 821±2k               | 821±2k              |    1    | mesh.utils.regions_combine.CombineRegionsCreateCube.tracemalloc_create_combined_cube(50)    |
|          | 24.6±0M              | 24.6±0M             |    1    | mesh.utils.regions_combine.CombineRegionsCreateCube.tracemalloc_create_combined_cube(500)   |
|          | 114±2ms              | 118±1ms             |    1.04 | mesh.utils.regions_combine.CombineRegionsFileStreamedCalc.time_stream_file2file(50)         |
|          | 482±6ms              | 491±5ms             |    1.02 | mesh.utils.regions_combine.CombineRegionsFileStreamedCalc.time_stream_file2file(500)        |
|          | 1.46±0.04M           | 1.44±0.07M          |    0.98 | mesh.utils.regions_combine.CombineRegionsFileStreamedCalc.tracemalloc_stream_file2file(50)  |
|          | 96.5±0.05M           | 96.5±0.07M          |    1    | mesh.utils.regions_combine.CombineRegionsFileStreamedCalc.tracemalloc_stream_file2file(500) |
|          | 77.3±3ms             | 78.7±1ms            |    1.02 | mesh.utils.regions_combine.CombineRegionsSaveData.time_save(50)                             |
|          | 437±4ms              | 438±4ms             |    1    | mesh.utils.regions_combine.CombineRegionsSaveData.time_save(500)                            |
|          | 1.37±0.04M           | 1.39±0.02M          |    1.02 | mesh.utils.regions_combine.CombineRegionsSaveData.tracemalloc_save(50)                      |
|          | 96.4±0.04M           | 96.4±0.03M          |    1    | mesh.utils.regions_combine.CombineRegionsSaveData.tracemalloc_save(500)                     |
|          | 2.175361             | 2.175361            |    1    | mesh.utils.regions_combine.CombineRegionsSaveData.track_filesize_saved(50)                  |
|          | 216.01536099999998   | 216.01536099999998  |    1    | mesh.utils.regions_combine.CombineRegionsSaveData.track_filesize_saved(500)                 |
|          | 6.22±0.09ms          | 6.14±0.1ms          |    0.99 | plot.AuxSort.time_aux_sort                                                                  |
|          | 84.9±2ms             | 84.9±2ms            |    1    | regridding.CurvilinearRegridding.time_regrid_pic                                            |
|          | 136±3M               | 136±3M              |    1    | regridding.CurvilinearRegridding.tracemalloc_regrid_pic                                     |
|          | 120±4ms              | 116±4ms             |    0.97 | regridding.HorizontalChunkedRegridding.time_regrid_area_w                                   |
|          | 87.5±1ms             | 84.7±2ms            |    0.97 | regridding.HorizontalChunkedRegridding.time_regrid_area_w_new_grid                          |
|          | 107±0.1M             | 107±0.1M            |    1    | regridding.HorizontalChunkedRegridding.tracemalloc_regrid_area_w                            |
|          | 147±0.03M            | 147±0.03M           |    1    | regridding.HorizontalChunkedRegridding.tracemalloc_regrid_area_w_new_grid                   |
|          | 5.03±0.2ms           | 4.99±0.1ms          |    0.99 | save.NetcdfSave.time_netcdf_save_cube(50, False)                                            |
|          | 86.3±2ms             | 84.0±2ms            |    0.97 | save.NetcdfSave.time_netcdf_save_cube(50, True)                                             |
|          | 25.6±0.9ms           | 26.6±1ms            |    1.04 | save.NetcdfSave.time_netcdf_save_cube(600, False)                                           |
|          | 398±3ms              | 395±4ms             |    0.99 | save.NetcdfSave.time_netcdf_save_cube(600, True)                                            |
|          | 1.71±0.2μs           | 1.58±0.1μs          |    0.93 | save.NetcdfSave.time_netcdf_save_mesh(50, False)                                            |
|          | 68.7±0.9ms           | 66.5±2ms            |    0.97 | save.NetcdfSave.time_netcdf_save_mesh(50, True)                                             |
|          | 2.17±0.2μs           | 2.16±0.1μs          |    1    | save.NetcdfSave.time_netcdf_save_mesh(600, False)                                           |
|          | 359±5ms              | 356±3ms             |    0.99 | save.NetcdfSave.time_netcdf_save_mesh(600, True)                                            |
|          | 31.5±1k              | 31.6±1k             |    1    | save.NetcdfSave.tracemalloc_netcdf_save(50, False)                                          |
|          | 1.8±0.2M             | 1.76±0.1M           |    0.98 | save.NetcdfSave.tracemalloc_netcdf_save(50, True)                                           |
|          | 31.5±1k              | 31.4±1k             |    1    | save.NetcdfSave.tracemalloc_netcdf_save(600, False)                                         |
|          | 225±30M              | 225±20M             |    1    | save.NetcdfSave.tracemalloc_netcdf_save(600, True)                                          |
|          | 44.5±0.5ms           | 44.1±1ms            |    0.99 | stats.PearsonR.time_lazy                                                                    |
|          | 14.0±0.4ms           | 13.9±0.5ms          |    1    | stats.PearsonR.time_real                                                                    |
|          | 28.4±1M              | 29.4±0.4M           |    1.03 | stats.PearsonR.tracemalloc_lazy                                                             |
|          | 18.3±0M              | 18.3±0M             |    1    | stats.PearsonR.tracemalloc_real                                                             |
|          | 26.7±0.7ms           | 26.3±0.7ms          |    0.98 | trajectory.TrajectoryInterpolation.time_trajectory_linear                                   |
|          | 77.7±0.5ms           | 78.5±0.6ms          |    1.01 | trajectory.TrajectoryInterpolation.time_trajectory_nearest                                  |
|          | 17.6±0.01M           | 17.6±0.01M          |    1    | trajectory.TrajectoryInterpolation.tracemalloc_trajectory_linear                            |
|          | 7.74±0.01M           | 7.74±0.01M          |    1    | trajectory.TrajectoryInterpolation.tracemalloc_trajectory_nearest                           |

Generated by GHA run 34532496164

@github-actions

Copy link
Copy Markdown
Contributor

⏱️ Performance Benchmark Report: 7f1c512

Performance shifts

Full benchmark results

Benchmarks that have stayed the same:

| Change   | Before [253510b3]    | After [7f1c5129]    | Ratio   | Benchmark (Parameter)                                                                       |
|----------|----------------------|---------------------|---------|---------------------------------------------------------------------------------------------|
|          | 21.0±1ms             | 20.6±1ms            | 0.98    | aggregate_collapse.Aggregation.time_aggregated_by_COUNT(False)                              |
|          | 51.5±0.8ms           | 51.2±2ms            | 0.99    | aggregate_collapse.Aggregation.time_aggregated_by_COUNT(True)                               |
|          | 34.5±2ms             | 34.7±2ms            | 1.01    | aggregate_collapse.Aggregation.time_aggregated_by_FAST_PERCENTILE(False)                    |
|          | 162±1ms              | 163±1ms             | 1.01    | aggregate_collapse.Aggregation.time_aggregated_by_FAST_PERCENTILE(True)                     |
|          | 22.5±1ms             | 23.2±1ms            | 1.03    | aggregate_collapse.Aggregation.time_aggregated_by_GMEAN(False)                              |
|          | 30.8±0.3ms           | 31.2±0.5ms          | 1.01    | aggregate_collapse.Aggregation.time_aggregated_by_GMEAN(True)                               |
|          | 22.7±1ms             | 22.6±2ms            | 1.00    | aggregate_collapse.Aggregation.time_aggregated_by_HMEAN(False)                              |
|          | 31.1±0.4ms           | 31.5±0.7ms          | 1.01    | aggregate_collapse.Aggregation.time_aggregated_by_HMEAN(True)                               |
|          | 20.5±2ms             | 20.1±1ms            | 0.98    | aggregate_collapse.Aggregation.time_aggregated_by_MAX(False)                                |
|          | 43.3±0.8ms           | 43.1±0.8ms          | 1.00    | aggregate_collapse.Aggregation.time_aggregated_by_MAX(True)                                 |
|          | 130±2ms              | 131±1ms             | 1.01    | aggregate_collapse.Aggregation.time_aggregated_by_MAX_RUN(False)                            |
|          | 129±0.6ms            | 132±1ms             | 1.02    | aggregate_collapse.Aggregation.time_aggregated_by_MAX_RUN(True)                             |
|          | 21.6±2ms             | 21.7±1ms            | 1.00    | aggregate_collapse.Aggregation.time_aggregated_by_MEAN(False)                               |
|          | 46.2±0.9ms           | 46.9±0.9ms          | 1.02    | aggregate_collapse.Aggregation.time_aggregated_by_MEAN(True)                                |
|          | 23.0±2ms             | 23.0±1ms            | 1.00    | aggregate_collapse.Aggregation.time_aggregated_by_MEDIAN(False)                             |
|          | 56.1±0.7ms           | 57.4±1ms            | 1.02    | aggregate_collapse.Aggregation.time_aggregated_by_MEDIAN(True)                              |
|          | 20.4±2ms             | 20.5±1ms            | 1.01    | aggregate_collapse.Aggregation.time_aggregated_by_MIN(False)                                |
|          | 43.1±0.6ms           | 43.4±0.6ms          | 1.01    | aggregate_collapse.Aggregation.time_aggregated_by_MIN(True)                                 |
|          | 1.08±0.01s           | 1.09±0.01s          | 1.01    | aggregate_collapse.Aggregation.time_aggregated_by_PEAK(False)                               |
|          | 1.06±0s              | 1.05±0.01s          | 0.99    | aggregate_collapse.Aggregation.time_aggregated_by_PEAK(True)                                |
|          | 212±5ms              | 212±3ms             | 1.00    | aggregate_collapse.Aggregation.time_aggregated_by_PERCENTILE(False)                         |
|          | 351±10ms             | 361±10ms            | 1.03    | aggregate_collapse.Aggregation.time_aggregated_by_PERCENTILE(True)                          |
|          | 21.6±2ms             | 21.5±2ms            | 1.00    | aggregate_collapse.Aggregation.time_aggregated_by_PROPORTION(False)                         |
|          | 29.4±0.4ms           | 28.9±0.5ms          | 0.98    | aggregate_collapse.Aggregation.time_aggregated_by_PROPORTION(True)                          |
|          | 21.6±2ms             | 22.0±1ms            | 1.02    | aggregate_collapse.Aggregation.time_aggregated_by_RMS(False)                                |
|          | 57.1±1ms             | 57.3±0.9ms          | 1.00    | aggregate_collapse.Aggregation.time_aggregated_by_RMS(True)                                 |
|          | 22.6±1ms             | 22.7±2ms            | 1.00    | aggregate_collapse.Aggregation.time_aggregated_by_STD_DEV(False)                            |
|          | 59.3±1ms             | 59.9±1ms            | 1.01    | aggregate_collapse.Aggregation.time_aggregated_by_STD_DEV(True)                             |
|          | 22.7±2ms             | 22.9±2ms            | 1.01    | aggregate_collapse.Aggregation.time_aggregated_by_VARIANCE(False)                           |
|          | 56.6±1ms             | 56.1±1ms            | 0.99    | aggregate_collapse.Aggregation.time_aggregated_by_VARIANCE(True)                            |
|          | 7.56±0.08ms          | 7.68±0.09ms         | 1.02    | aggregate_collapse.Aggregation.time_collapsed_by_COUNT(False)                               |
|          | 20.8±0.4ms           | 21.3±0.4ms          | 1.02    | aggregate_collapse.Aggregation.time_collapsed_by_COUNT(True)                                |
|          | 19.1±0.2ms           | 19.4±0.1ms          | 1.02    | aggregate_collapse.Aggregation.time_collapsed_by_FAST_PERCENTILE(False)                     |
|          | 120±3ms              | 121±2ms             | 1.01    | aggregate_collapse.Aggregation.time_collapsed_by_FAST_PERCENTILE(True)                      |
|          | 7.96±0.07ms          | 8.03±0.07ms         | 1.01    | aggregate_collapse.Aggregation.time_collapsed_by_GMEAN(False)                               |
|          | 19.4±0.2ms           | 19.3±0.3ms          | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_GMEAN(True)                                |
|          | 8.05±0.05ms          | 7.98±0.07ms         | 0.99    | aggregate_collapse.Aggregation.time_collapsed_by_HMEAN(False)                               |
|          | 19.5±0.4ms           | 19.4±0.2ms          | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_HMEAN(True)                                |
|          | 7.65±0.04ms          | 7.67±0.1ms          | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_MAX(False)                                 |
|          | 19.9±0.4ms           | 19.9±0.4ms          | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_MAX(True)                                  |
|          | 25.2±1ms             | 25.4±1ms            | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_MAX_RUN(False)                             |
|          | 34.3±0.6ms           | 34.2±0.4ms          | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_MAX_RUN(True)                              |
|          | 7.87±0.1ms           | 7.88±0.05ms         | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_MEAN(False)                                |
|          | 20.2±0.3ms           | 20.2±0.2ms          | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_MEAN(True)                                 |
|          | 8.70±0.06ms          | 8.82±0.08ms         | 1.01    | aggregate_collapse.Aggregation.time_collapsed_by_MEDIAN(False)                              |
|          | 22.6±0.3ms           | 22.1±0.3ms          | 0.98    | aggregate_collapse.Aggregation.time_collapsed_by_MEDIAN(True)                               |
|          | 7.72±0.06ms          | 7.54±0.05ms         | 0.98    | aggregate_collapse.Aggregation.time_collapsed_by_MIN(False)                                 |
|          | 19.7±0.4ms           | 20.2±0.3ms          | 1.03    | aggregate_collapse.Aggregation.time_collapsed_by_MIN(True)                                  |
|          | 570±2ms              | 570±0.6ms           | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_PEAK(False)                                |
|          | 577±0.4ms            | 577±0.5ms           | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_PEAK(True)                                 |
|          | 44.1±0.6ms           | 44.0±0.2ms          | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_PERCENTILE(False)                          |
|          | 135±4ms              | 133±2ms             | 0.98    | aggregate_collapse.Aggregation.time_collapsed_by_PERCENTILE(True)                           |
|          | 7.86±0.07ms          | 7.86±0.08ms         | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_PROPORTION(False)                          |
|          | 19.1±0.3ms           | 19.1±0.1ms          | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_PROPORTION(True)                           |
|          | 7.80±0.06ms          | 7.80±0.2ms          | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_RMS(False)                                 |
|          | 21.7±0.2ms           | 21.5±0.2ms          | 0.99    | aggregate_collapse.Aggregation.time_collapsed_by_RMS(True)                                  |
|          | 8.18±0.08ms          | 8.22±0.07ms         | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_STD_DEV(False)                             |
|          | 21.6±0.3ms           | 21.4±0.2ms          | 0.99    | aggregate_collapse.Aggregation.time_collapsed_by_STD_DEV(True)                              |
|          | 8.00±0.06ms          | 8.00±0.1ms          | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_VARIANCE(False)                            |
|          | 20.9±0.3ms           | 20.9±0.3ms          | 1.00    | aggregate_collapse.Aggregation.time_collapsed_by_VARIANCE(True)                             |
|          | 22.2±2ms             | 22.1±1ms            | 1.00    | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_MEAN(False)                     |
|          | 80.8±0.8ms           | 80.7±0.6ms          | 1.00    | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_MEAN(True)                      |
|          | 22.1±2ms             | 22.2±2ms            | 1.01    | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_RMS(False)                      |
|          | 92.3±0.8ms           | 91.5±0.7ms          | 0.99    | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_RMS(True)                       |
|          | 20.8±2ms             | 21.1±2ms            | 1.01    | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_SUM(False)                      |
|          | 52.8±0.6ms           | 52.2±0.7ms          | 0.99    | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_SUM(True)                       |
|          | 8.20±0.1ms           | 8.21±0.04ms         | 1.00    | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_MEAN(False)                      |
|          | 26.4±0.5ms           | 26.4±0.6ms          | 1.00    | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_MEAN(True)                       |
|          | 7.99±0.04ms          | 7.86±0.05ms         | 0.98    | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_RMS(False)                       |
|          | 28.1±0.6ms           | 28.2±0.6ms          | 1.00    | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_RMS(True)                        |
|          | 7.86±0.04ms          | 7.70±0.05ms         | 0.98    | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_SUM(False)                       |
|          | 21.5±0.2ms           | 21.6±0.2ms          | 1.00    | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_SUM(True)                        |
|          | 206±2ms              | 203±2ms             | 0.98    | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_WPERCENTILE(False)               |
|          | 270±2ms              | 267±3ms             | 0.99    | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_WPERCENTILE(True)                |
|          | 1.22±0.01ms          | 1.20±0.02ms         | 0.99    | cube.CubeCreation.time_create(False, 'construct')                                           |
|          | 456±10μs             | 469±9μs             | 1.03    | cube.CubeCreation.time_create(False, 'instantiate')                                         |
|          | 1.94±0.02ms          | 1.94±0.03ms         | 1.00    | cube.CubeCreation.time_create(True, 'construct')                                            |
|          | 1.35±0.02ms          | 1.38±0.02ms         | 1.02    | cube.CubeCreation.time_create(True, 'instantiate')                                          |
|          | 79.1±2ms             | 77.9±2ms            | 0.98    | cube.CubeEquality.time_equality(False, False, 'all_equal')                                  |
|          | 26.3±1ms             | 25.1±1ms            | 0.96    | cube.CubeEquality.time_equality(False, False, 'coord_inequality')                           |
|          | 88.7±2ms             | 89.7±0.8ms          | 1.01    | cube.CubeEquality.time_equality(False, False, 'data_inequality')                            |
|          | 61.7±2μs             | 61.5±3μs            | 1.00    | cube.CubeEquality.time_equality(False, False, 'metadata_inequality')                        |
|          | 80.6±1ms             | 80.4±0.7ms          | 1.00    | cube.CubeEquality.time_equality(False, True, 'all_equal')                                   |
|          | 28.7±0.6ms           | 28.2±0.3ms          | 0.98    | cube.CubeEquality.time_equality(False, True, 'coord_inequality')                            |
|          | 93.4±1ms             | 91.6±2ms            | 0.98    | cube.CubeEquality.time_equality(False, True, 'data_inequality')                             |
|          | 64.6±8μs             | 62.6±2μs            | 0.97    | cube.CubeEquality.time_equality(False, True, 'metadata_inequality')                         |
|          | 157±3ms              | 153±5ms             | 0.97    | cube.CubeEquality.time_equality(True, False, 'all_equal')                                   |
|          | 66.8±2ms             | 66.4±2ms            | 0.99    | cube.CubeEquality.time_equality(True, False, 'coord_inequality')                            |
|          | 180±3ms              | 183±3ms             | 1.02    | cube.CubeEquality.time_equality(True, False, 'data_inequality')                             |
|          | 86.9±3μs             | 83.4±2μs            | 0.96    | cube.CubeEquality.time_equality(True, False, 'metadata_inequality')                         |
|          | 226±3ms              | 224±2ms             | 0.99    | cube.CubeEquality.time_equality(True, True, 'all_equal')                                    |
|          | 137±2ms              | 135±0.9ms           | 0.98    | cube.CubeEquality.time_equality(True, True, 'coord_inequality')                             |
|          | 252±4ms              | 246±2ms             | 0.98    | cube.CubeEquality.time_equality(True, True, 'data_inequality')                              |
|          | 392±10μs             | 404±10μs            | 1.03    | cube.CubeEquality.time_equality(True, True, 'metadata_inequality')                          |
|          | 843±10μs             | 850±4μs             | 1.01    | import_iris.Iris.time__concatenate                                                          |
|          | 183±3μs              | 189±6μs             | 1.03    | import_iris.Iris.time__constraints                                                          |
|          | 115±0.9μs            | 115±1μs             | 1.00    | import_iris.Iris.time__data_manager                                                         |
|          | 100±1μs              | 100±0.5μs           | 1.00    | import_iris.Iris.time__deprecation                                                          |
|          | 164±0.7μs            | 165±2μs             | 1.00    | import_iris.Iris.time__lazy_data                                                            |
|          | 972±10μs             | 976±7μs             | 1.00    | import_iris.Iris.time__merge                                                                |
|          | 74.1±1μs             | 73.2±0.3μs          | 0.99    | import_iris.Iris.time__representation                                                       |
|          | 620±4μs              | 611±6μs             | 0.99    | import_iris.Iris.time_analysis                                                              |
|          | 140±2μs              | 137±0.7μs           | 0.98    | import_iris.Iris.time_analysis__area_weighted                                               |
|          | 122±2μs              | 123±1μs             | 1.01    | import_iris.Iris.time_analysis__grid_angles                                                 |
|          | 251±2μs              | 251±1μs             | 1.00    | import_iris.Iris.time_analysis__interpolation                                               |
|          | 187±1μs              | 187±1μs             | 1.00    | import_iris.Iris.time_analysis__regrid                                                      |
|          | 110±2μs              | 109±1μs             | 0.99    | import_iris.Iris.time_analysis__scipy_interpolate                                           |
|          | 138±3μs              | 139±3μs             | 1.01    | import_iris.Iris.time_analysis_calculus                                                     |
|          | 332±2μs              | 328±5μs             | 0.99    | import_iris.Iris.time_analysis_cartography                                                  |
|          | 91.5±0.3μs           | 89.3±0.7μs          | 0.98    | import_iris.Iris.time_analysis_geomerty                                                     |
|          | 205±3μs              | 206±2μs             | 1.00    | import_iris.Iris.time_analysis_maths                                                        |
|          | 92.3±2μs             | 92.1±1μs            | 1.00    | import_iris.Iris.time_analysis_stats                                                        |
|          | 169±1μs              | 166±2μs             | 0.99    | import_iris.Iris.time_analysis_trajectory                                                   |
|          | 313±5μs              | 312±3μs             | 1.00    | import_iris.Iris.time_aux_factory                                                           |
|          | 80.2±0.4μs           | 80.0±0.4μs          | 1.00    | import_iris.Iris.time_common                                                                |
|          | 160±2μs              | 160±2μs             | 1.00    | import_iris.Iris.time_common_lenient                                                        |
|          | 1.55±0.01ms          | 1.53±0.01ms         | 0.99    | import_iris.Iris.time_common_metadata                                                       |
|          | 176±2μs              | 177±1μs             | 1.01    | import_iris.Iris.time_common_mixin                                                          |
|          | 1.17±0.02ms          | 1.17±0.01ms         | 1.00    | import_iris.Iris.time_common_resolve                                                        |
|          | 252±3μs              | 251±2μs             | 0.99    | import_iris.Iris.time_config                                                                |
|          | 132±0.9μs            | 132±2μs             | 1.00    | import_iris.Iris.time_coord_categorisation                                                  |
|          | 374±8μs              | 376±5μs             | 1.00    | import_iris.Iris.time_coord_systems                                                         |
|          | 822±10μs             | 811±10μs            | 0.99    | import_iris.Iris.time_coords                                                                |
|          | 724±8μs              | 717±6μs             | 0.99    | import_iris.Iris.time_cube                                                                  |
|          | 264±5μs              | 257±3μs             | 0.98    | import_iris.Iris.time_exceptions                                                            |
|          | 74.3±0.3μs           | 74.0±0.4μs          | 1.00    | import_iris.Iris.time_experimental                                                          |
|          | 191±1μs              | 187±1μs             | 0.98    | import_iris.Iris.time_fileformats                                                           |
|          | 251±3μs              | 250±2μs             | 0.99    | import_iris.Iris.time_fileformats__ff                                                       |
|          | 2.53±0.01ms          | 2.52±0.02ms         | 0.99    | import_iris.Iris.time_fileformats__ff_cross_references                                      |
|          | 75.9±0.8μs           | 75.6±0.6μs          | 1.00    | import_iris.Iris.time_fileformats__pp_lbproc_pairs                                          |
|          | 114±0.9μs            | 112±0.4μs           | 0.98    | import_iris.Iris.time_fileformats_abf                                                       |
|          | 426±5μs              | 424±4μs             | 0.99    | import_iris.Iris.time_fileformats_cf                                                        |
|          | 4.47±0.04ms          | 4.48±0.04ms         | 1.00    | import_iris.Iris.time_fileformats_dot                                                       |
|          | 70.9±1μs             | 70.5±0.8μs          | 0.99    | import_iris.Iris.time_fileformats_name                                                      |
|          | 252±2μs              | 251±2μs             | 1.00    | import_iris.Iris.time_fileformats_name_loaders                                              |
|          | 113±0.7μs            | 113±1μs             | 1.00    | import_iris.Iris.time_fileformats_netcdf                                                    |
|          | 157±1μs              | 156±2μs             | 0.99    | import_iris.Iris.time_fileformats_nimrod                                                    |
|          | 311±3μs              | 311±3μs             | 1.00    | import_iris.Iris.time_fileformats_nimrod_load_rules                                         |
|          | 795±4μs              | 801±7μs             | 1.01    | import_iris.Iris.time_fileformats_pp                                                        |
|          | 175±1μs              | 173±2μs             | 0.99    | import_iris.Iris.time_fileformats_pp_load_rules                                             |
|          | 137±5μs              | 128±2μs             | 0.94    | import_iris.Iris.time_fileformats_pp_save_rules                                             |
|          | 569±2μs              | 560±2μs             | 0.99    | import_iris.Iris.time_fileformats_rules                                                     |
|          | 224±0.6μs            | 223±1μs             | 1.00    | import_iris.Iris.time_fileformats_structured_array_identification                           |
|          | 81.8±1μs             | 81.0±0.4μs          | 0.99    | import_iris.Iris.time_fileformats_um                                                        |
|          | 158±1μs              | 155±0.9μs           | 0.98    | import_iris.Iris.time_fileformats_um__fast_load                                             |
|          | 134±0.5μs            | 135±1μs             | 1.01    | import_iris.Iris.time_fileformats_um__fast_load_structured_fields                           |
|          | 71.7±0.3μs           | 71.2±0.1μs          | 0.99    | import_iris.Iris.time_fileformats_um__ff_replacement                                        |
|          | 78.3±0.9μs           | 77.6±1μs            | 0.99    | import_iris.Iris.time_fileformats_um__optimal_array_structuring                             |
|          | 938±10μs             | 942±10μs            | 1.00    | import_iris.Iris.time_fileformats_um_cf_map                                                 |
|          | 140±2μs              | 138±0.9μs           | 0.99    | import_iris.Iris.time_io                                                                    |
|          | 177±2μs              | 175±2μs             | 0.99    | import_iris.Iris.time_io_format_picker                                                      |
|          | 201±1μs              | 199±0.7μs           | 0.99    | import_iris.Iris.time_iris                                                                  |
|          | 126±0.4μs            | 125±0.7μs           | 0.99    | import_iris.Iris.time_iterate                                                               |
|          | 34.2±0.1ms           | 34.1±0.3ms          | 1.00    | import_iris.Iris.time_palette                                                               |
|          | 1.87±0.01ms          | 1.86±0.02ms         | 0.99    | import_iris.Iris.time_plot                                                                  |
|          | 257±10μs             | 257±10μs            | 1.00    | import_iris.Iris.time_quickplot                                                             |
|          | 2.09±0.01ms          | 2.10±0.01ms         | 1.00    | import_iris.Iris.time_std_names                                                             |
|          | 1.81±0.01ms          | 1.82±0.01ms         | 1.00    | import_iris.Iris.time_symbols                                                               |
|          | 53.1±8ms             | 36.5±20ms           | ~0.69   | import_iris.Iris.time_tests                                                                 |
|          | 247±4μs              | 248±1μs             | 1.01    | import_iris.Iris.time_third_party_cartopy                                                   |
|          | 4.96±0.02ms          | 4.98±0.03ms         | 1.00    | import_iris.Iris.time_third_party_cf_units                                                  |
|          | 120±0.5μs            | 121±0.6μs           | 1.01    | import_iris.Iris.time_third_party_cftime                                                    |
|          | 2.52±0.01ms          | 2.50±0.01ms         | 1.00    | import_iris.Iris.time_third_party_matplotlib                                                |
|          | 550±20μs             | 520±20μs            | 0.95    | import_iris.Iris.time_third_party_numpy                                                     |
|          | 170±1μs              | 174±0.8μs           | 1.02    | import_iris.Iris.time_third_party_scipy                                                     |
|          | 97.7±0.5μs           | 98.9±0.4μs          | 1.01    | import_iris.Iris.time_time                                                                  |
|          | 828±6μs              | 840±6μs             | 1.01    | import_iris.Iris.time_util                                                                  |
|          | 62.0±2μs             | 61.9±2μs            | 1.00    | iterate.IZip.time_izip                                                                      |
|          | 9.85±0.09ms          | 9.65±0.1ms          | 0.98    | load.LoadAndRealise.time_load((1280, 960, 5), False, 'FF')                                  |
|          | 16.1±0.1ms           | 16.2±0.5ms          | 1.01    | load.LoadAndRealise.time_load((1280, 960, 5), False, 'NetCDF')                              |
|          | 9.57±0.09ms          | 9.71±0.04ms         | 1.01    | load.LoadAndRealise.time_load((1280, 960, 5), False, 'PP')                                  |
|          | 9.69±0.08ms          | 9.79±0.1ms          | 1.01    | load.LoadAndRealise.time_load((1280, 960, 5), True, 'FF')                                   |
|          | 14.0±0.1ms           | 14.0±0.09ms         | 1.00    | load.LoadAndRealise.time_load((1280, 960, 5), True, 'NetCDF')                               |
|          | 9.71±0.04ms          | 9.61±0.08ms         | 0.99    | load.LoadAndRealise.time_load((1280, 960, 5), True, 'PP')                                   |
|          | 1.48±0.02s           | 1.49±0.02s          | 1.00    | load.LoadAndRealise.time_load((2, 2, 1000), False, 'FF')                                    |
|          | 13.0±0.09ms          | 12.8±0.03ms         | 0.99    | load.LoadAndRealise.time_load((2, 2, 1000), False, 'NetCDF')                                |
|          | 1.47±0s              | 1.50±0.02s          | 1.02    | load.LoadAndRealise.time_load((2, 2, 1000), False, 'PP')                                    |
|          | 1.49±0.01s           | 1.48±0s             | 0.99    | load.LoadAndRealise.time_load((2, 2, 1000), True, 'FF')                                     |
|          | 13.0±0.2ms           | 12.9±0.04ms         | 0.99    | load.LoadAndRealise.time_load((2, 2, 1000), True, 'NetCDF')                                 |
|          | 1.47±0.02s           | 1.47±0.03s          | 1.00    | load.LoadAndRealise.time_load((2, 2, 1000), True, 'PP')                                     |
|          | 5.16±0.05ms          | 5.15±0.03ms         | 1.00    | load.LoadAndRealise.time_load((50, 50, 2), False, 'FF')                                     |
|          | 12.6±0.05ms          | 12.5±0.1ms          | 0.99    | load.LoadAndRealise.time_load((50, 50, 2), False, 'NetCDF')                                 |
|          | 5.06±0.02ms          | 5.07±0.05ms         | 1.00    | load.LoadAndRealise.time_load((50, 50, 2), False, 'PP')                                     |
|          | 5.16±0.03ms          | 5.14±0.03ms         | 1.00    | load.LoadAndRealise.time_load((50, 50, 2), True, 'FF')                                      |
|          | 12.4±0.06ms          | 12.7±0.2ms          | 1.02    | load.LoadAndRealise.time_load((50, 50, 2), True, 'NetCDF')                                  |
|          | 5.02±0.02ms          | 5.03±0.04ms         | 1.00    | load.LoadAndRealise.time_load((50, 50, 2), True, 'PP')                                      |
|          | 20.8±0.5ms           | 20.9±1ms            | 1.00    | load.LoadAndRealise.time_realise((1280, 960, 5), False, 'FF')                               |
|          | 20.1±0.4ms           | 19.9±0.3ms          | 0.99    | load.LoadAndRealise.time_realise((1280, 960, 5), False, 'NetCDF')                           |
|          | 11.7±0.4ms           | 12.2±1ms            | 1.05    | load.LoadAndRealise.time_realise((1280, 960, 5), False, 'PP')                               |
|          | 28.4±0.9ms           | 28.5±0.7ms          | 1.00    | load.LoadAndRealise.time_realise((1280, 960, 5), True, 'FF')                                |
|          | 70.1±0.3ms           | 70.0±0.1ms          | 1.00    | load.LoadAndRealise.time_realise((1280, 960, 5), True, 'NetCDF')                            |
|          | 28.3±0.8ms           | 28.0±0.7ms          | 0.99    | load.LoadAndRealise.time_realise((1280, 960, 5), True, 'PP')                                |
|          | 627±3ms              | 622±2ms             | 0.99    | load.LoadAndRealise.time_realise((2, 2, 1000), False, 'FF')                                 |
|          | 3.43±0.2ms           | 3.40±0.08ms         | 0.99    | load.LoadAndRealise.time_realise((2, 2, 1000), False, 'NetCDF')                             |
|          | 627±3ms              | 626±2ms             | 1.00    | load.LoadAndRealise.time_realise((2, 2, 1000), False, 'PP')                                 |
|          | 628±2ms              | 623±2ms             | 0.99    | load.LoadAndRealise.time_realise((2, 2, 1000), True, 'FF')                                  |
|          | 3.46±0.1ms           | 3.43±0.07ms         | 0.99    | load.LoadAndRealise.time_realise((2, 2, 1000), True, 'NetCDF')                              |
|          | 626±3ms              | 624±1ms             | 1.00    | load.LoadAndRealise.time_realise((2, 2, 1000), True, 'PP')                                  |
|          | 2.17±0.02ms          | 2.16±0.07ms         | 0.99    | load.LoadAndRealise.time_realise((50, 50, 2), False, 'FF')                                  |
|          | 3.33±0.08ms          | 3.34±0.1ms          | 1.01    | load.LoadAndRealise.time_realise((50, 50, 2), False, 'NetCDF')                              |
|          | 2.20±0.05ms          | 2.16±0.03ms         | 0.98    | load.LoadAndRealise.time_realise((50, 50, 2), False, 'PP')                                  |
|          | 2.25±0.05ms          | 2.18±0.03ms         | 0.97    | load.LoadAndRealise.time_realise((50, 50, 2), True, 'FF')                                   |
|          | 3.51±0.09ms          | 3.41±0.2ms          | 0.97    | load.LoadAndRealise.time_realise((50, 50, 2), True, 'NetCDF')                               |
|          | 2.21±0.02ms          | 2.18±0.06ms         | 0.99    | load.LoadAndRealise.time_realise((50, 50, 2), True, 'PP')                                   |
|          | 366±4ms              | 363±3ms             | 0.99    | load.ManyCubes.time_many_cube_load                                                          |
|          | 92.7±0.9ms           | 91.8±0.4ms          | 0.99    | load.ManyVars.time_many_var_load                                                            |
|          | 9.87±0.08ms          | 9.84±0.1ms          | 1.00    | load.STASHConstraint.time_stash_constraint((1280, 960, 5), 'FF')                            |
|          | 9.69±0.2ms           | 9.76±0.1ms          | 1.01    | load.STASHConstraint.time_stash_constraint((1280, 960, 5), 'PP')                            |
|          | 1.49±0.02s           | 1.48±0.02s          | 0.99    | load.STASHConstraint.time_stash_constraint((2, 2, 1000), 'FF')                              |
|          | 1.48±0.01s           | 1.52±0.03s          | 1.03    | load.STASHConstraint.time_stash_constraint((2, 2, 1000), 'PP')                              |
|          | 5.19±0.02ms          | 5.24±0.06ms         | 1.01    | load.STASHConstraint.time_stash_constraint((2, 2, 2), 'FF')                                 |
|          | 5.09±0.03ms          | 4.97±0.03ms         | 0.98    | load.STASHConstraint.time_stash_constraint((2, 2, 2), 'PP')                                 |
|          | 8.85±0.06ms          | 8.96±0.1ms          | 1.01    | load.StructuredFF.time_structured_load((1280, 960, 5), False)                               |
|          | 5.57±0.03ms          | 5.51±0.03ms         | 0.99    | load.StructuredFF.time_structured_load((1280, 960, 5), True)                                |
|          | 1.49±0.01s           | 1.46±0.01s          | 0.98    | load.StructuredFF.time_structured_load((2, 2, 1000), False)                                 |
|          | 419±1ms              | 428±5ms             | 1.02    | load.StructuredFF.time_structured_load((2, 2, 1000), True)                                  |
|          | 4.31±0.02ms          | 4.32±0.02ms         | 1.00    | load.StructuredFF.time_structured_load((2, 2, 2), False)                                    |
|          | 4.19±0.04ms          | 4.12±0.03ms         | 0.99    | load.StructuredFF.time_structured_load((2, 2, 2), True)                                     |
|          | 153±0.8ms            | 152±0.8ms           | 0.99    | load.TimeConstraint.time_time_constraint(20, 'FF')                                          |
|          | 15.1±0.09ms          | 15.2±0.06ms         | 1.01    | load.TimeConstraint.time_time_constraint(20, 'NetCDF')                                      |
|          | 151±0.3ms            | 152±0.4ms           | 1.01    | load.TimeConstraint.time_time_constraint(20, 'PP')                                          |
|          | 30.7±0.2ms           | 30.7±0.5ms          | 1.00    | load.TimeConstraint.time_time_constraint(3, 'FF')                                           |
|          | 15.1±0.09ms          | 15.1±0.07ms         | 1.00    | load.TimeConstraint.time_time_constraint(3, 'NetCDF')                                       |
|          | 30.0±0.3ms           | 30.2±0.2ms          | 1.01    | load.TimeConstraint.time_time_constraint(3, 'PP')                                           |
|          | 19.4±0.2ms           | 19.4±0.3ms          | 1.00    | load.ugrid.BasicLoading.time_load_file(1)                                                   |
|          | 49.0±0.6ms           | 49.5±0.7ms          | 1.01    | load.ugrid.BasicLoading.time_load_file(200000)                                              |
|          | 9.61±0.1ms           | 9.57±0.1ms          | 1.00    | load.ugrid.BasicLoading.time_load_mesh(1)                                                   |
|          | 16.8±0.6ms           | 16.8±0.4ms          | 1.00    | load.ugrid.BasicLoading.time_load_mesh(200000)                                              |
|          | 19.6±0.2ms           | 19.3±0.2ms          | 0.98    | load.ugrid.BasicLoadingTime.time_load_file(1)                                               |
|          | 20.9±0.3ms           | 19.4±0.4ms          | 0.93    | load.ugrid.BasicLoadingTime.time_load_file(200000)                                          |
|          | 9.66±0.1ms           | 9.53±0.1ms          | 0.99    | load.ugrid.BasicLoadingTime.time_load_mesh(1)                                               |
|          | 12.3±0.4ms           | 12.5±0.5ms          | 1.01    | load.ugrid.BasicLoadingTime.time_load_mesh(200000)                                          |
|          | 21.6±0.1ms           | 21.3±0.5ms          | 0.99    | load.ugrid.Callback.time_load_file_callback(1)                                              |
|          | 62.3±2ms             | 61.2±1ms            | 0.98    | load.ugrid.Callback.time_load_file_callback(200000)                                         |
|          | 21.6±0.4ms           | 21.6±0.3ms          | 1.00    | load.ugrid.CallbackTime.time_load_file_callback(1)                                          |
|          | 23.0±0.6ms           | 23.2±0.9ms          | 1.01    | load.ugrid.CallbackTime.time_load_file_callback(200000)                                     |
|          | 3.32±0.1ms           | 3.38±0.1ms          | 1.02    | load.ugrid.DataRealisation.time_realise_data(10000)                                         |
|          | 4.34±0.1ms           | 4.41±0.2ms          | 1.02    | load.ugrid.DataRealisation.time_realise_data(200000)                                        |
|          | 42.5±2ms             | 43.3±2ms            | 1.02    | load.ugrid.DataRealisationTime.time_realise_data(10000)                                     |
|          | 990±20ms             | 983±8ms             | 0.99    | load.ugrid.DataRealisationTime.time_realise_data(200000)                                    |
|          | 1.06±0.02s           | 1.05±0.01s          | 0.99    | merge_concat.Concatenate.time_concatenate(False)                                            |
|          | 438±4ms              | 431±4ms             | 0.99    | merge_concat.Concatenate.time_concatenate(True)                                             |
|          | 2.21±0G              | 2.21±0G             | 1.00    | merge_concat.Concatenate.tracemalloc_concatenate(False)                                     |
|          | 71.7±4M              | 71.7±4M             | 1.00    | merge_concat.Concatenate.tracemalloc_concatenate(True)                                      |
|          | 32.6±0.7ms           | 31.3±1ms            | 0.96    | merge_concat.Merge.time_merge                                                               |
|          | 126±0.03M            | 126±0.03M           | 1.00    | merge_concat.Merge.tracemalloc_merge                                                        |
|          | 5.58±0.04ms          | 5.54±0.05ms         | 0.99    | mesh.utils.regions_combine.CombineRegionsComputeRealData.time_compute_data(50)              |
|          | 146±2ms              | 144±1ms             | 0.99    | mesh.utils.regions_combine.CombineRegionsComputeRealData.time_compute_data(500)             |
|          | 769±3k               | 769±3k              | 1.00    | mesh.utils.regions_combine.CombineRegionsComputeRealData.tracemalloc_compute_data(50)       |
|          | 60.2±0M              | 60.2±0M             | 1.00    | mesh.utils.regions_combine.CombineRegionsComputeRealData.tracemalloc_compute_data(500)      |
|          | 18.7±0.3ms           | 18.3±0.1ms          | 0.98    | mesh.utils.regions_combine.CombineRegionsCreateCube.time_create_combined_cube(50)           |
|          | 21.8±0.4ms           | 21.7±0.1ms          | 1.00    | mesh.utils.regions_combine.CombineRegionsCreateCube.time_create_combined_cube(500)          |
|          | 820±2k               | 821±2k              | 1.00    | mesh.utils.regions_combine.CombineRegionsCreateCube.tracemalloc_create_combined_cube(50)    |
|          | 24.6±0M              | 24.6±0M             | 1.00    | mesh.utils.regions_combine.CombineRegionsCreateCube.tracemalloc_create_combined_cube(500)   |
|          | 111±2ms              | 111±0.8ms           | 1.00    | mesh.utils.regions_combine.CombineRegionsFileStreamedCalc.time_stream_file2file(50)         |
|          | 390±3ms              | 394±3ms             | 1.01    | mesh.utils.regions_combine.CombineRegionsFileStreamedCalc.time_stream_file2file(500)        |
|          | 1.48±0.05M           | 1.44±0.05M          | 0.97    | mesh.utils.regions_combine.CombineRegionsFileStreamedCalc.tracemalloc_stream_file2file(50)  |
|          | 96.5±0.06M           | 96.5±0.1M           | 1.00    | mesh.utils.regions_combine.CombineRegionsFileStreamedCalc.tracemalloc_stream_file2file(500) |
|          | 73.2±1ms             | 73.0±0.4ms          | 1.00    | mesh.utils.regions_combine.CombineRegionsSaveData.time_save(50)                             |
|          | 351±2ms              | 349±3ms             | 0.99    | mesh.utils.regions_combine.CombineRegionsSaveData.time_save(500)                            |
|          | 1.39±0.02M           | 1.36±0.03M          | 0.98    | mesh.utils.regions_combine.CombineRegionsSaveData.tracemalloc_save(50)                      |
|          | 96.4±0.02M           | 96.4±0.04M          | 1.00    | mesh.utils.regions_combine.CombineRegionsSaveData.tracemalloc_save(500)                     |
|          | 2.175361             | 2.175361            | 1.00    | mesh.utils.regions_combine.CombineRegionsSaveData.track_filesize_saved(50)                  |
|          | 216.01536099999998   | 216.01536099999998  | 1.00    | mesh.utils.regions_combine.CombineRegionsSaveData.track_filesize_saved(500)                 |
|          | 6.30±0.05ms          | 6.29±0.03ms         | 1.00    | plot.AuxSort.time_aux_sort                                                                  |
|          | 52.0±0.9ms           | 51.6±0.9ms          | 0.99    | regridding.CurvilinearRegridding.time_regrid_pic                                            |
|          | 136±3M               | 136±3M              | 1.00    | regridding.CurvilinearRegridding.tracemalloc_regrid_pic                                     |
|          | 93.4±6ms             | 94.5±6ms            | 1.01    | regridding.HorizontalChunkedRegridding.time_regrid_area_w                                   |
|          | 51.4±0.5ms           | 52.7±0.5ms          | 1.02    | regridding.HorizontalChunkedRegridding.time_regrid_area_w_new_grid                          |
|          | 107±0.09M            | 107±0.1M            | 1.00    | regridding.HorizontalChunkedRegridding.tracemalloc_regrid_area_w                            |
|          | 147±0.03M            | 147±0.03M           | 1.00    | regridding.HorizontalChunkedRegridding.tracemalloc_regrid_area_w_new_grid                   |
|          | 4.62±0.03ms          | 4.65±0.07ms         | 1.01    | save.NetcdfSave.time_netcdf_save_cube(50, False)                                            |
|          | 79.0±0.6ms           | 79.1±0.7ms          | 1.00    | save.NetcdfSave.time_netcdf_save_cube(50, True)                                             |
|          | 20.3±0.9ms           | 20.6±0.6ms          | 1.01    | save.NetcdfSave.time_netcdf_save_cube(600, False)                                           |
|          | 274±1ms              | 274±2ms             | 1.00    | save.NetcdfSave.time_netcdf_save_cube(600, True)                                            |
|          | 982±40ns             | 932±200ns           | 0.95    | save.NetcdfSave.time_netcdf_save_mesh(50, False)                                            |
|          | 60.2±0.4ms           | 60.4±0.7ms          | 1.00    | save.NetcdfSave.time_netcdf_save_mesh(50, True)                                             |
|          | 2.33±0.1μs           | 2.21±0.2μs          | 0.95    | save.NetcdfSave.time_netcdf_save_mesh(600, False)                                           |
|          | 237±3ms              | 241±3ms             | 1.02    | save.NetcdfSave.time_netcdf_save_mesh(600, True)                                            |
|          | 31.6±1k              | 31.5±1k             | 1.00    | save.NetcdfSave.tracemalloc_netcdf_save(50, False)                                          |
|          | 1.79±0.2M            | 1.84±0.2M           | 1.03    | save.NetcdfSave.tracemalloc_netcdf_save(50, True)                                           |
|          | 31.4±1k              | 31.6±1k             | 1.01    | save.NetcdfSave.tracemalloc_netcdf_save(600, False)                                         |
|          | 225±20M              | 225±30M             | 1.00    | save.NetcdfSave.tracemalloc_netcdf_save(600, True)                                          |
|          | 39.7±0.5ms           | 39.9±0.3ms          | 1.00    | stats.PearsonR.time_lazy                                                                    |
|          | 9.40±0.1ms           | 9.54±0.05ms         | 1.02    | stats.PearsonR.time_real                                                                    |
|          | 29.7±0.6M            | 29.4±0.6M           | 0.99    | stats.PearsonR.tracemalloc_lazy                                                             |
|          | 18.3±0M              | 18.3±0M             | 1.00    | stats.PearsonR.tracemalloc_real                                                             |
|          | 23.3±0.3ms           | 23.2±0.6ms          | 0.99    | trajectory.TrajectoryInterpolation.time_trajectory_linear                                   |
|          | 78.9±0.6ms           | 80.1±0.5ms          | 1.01    | trajectory.TrajectoryInterpolation.time_trajectory_nearest                                  |
|          | 17.6±0.01M           | 17.6±0.01M          | 1.00    | trajectory.TrajectoryInterpolation.tracemalloc_trajectory_linear                            |
|          | 7.74±0.01M           | 7.74±0.01M          | 1.00    | trajectory.TrajectoryInterpolation.tracemalloc_trajectory_nearest                           |

Generated by GHA run 34536002821

@bjlittle
bjlittle merged commit 7689b98 into SciTools:greenfield Sep 10, 2026
21 checks passed
bjlittle added a commit that referenced this pull request Sep 11, 2026
…oadmap row 1) (#7275)

* Credit Claude for agentic changelog entries

Attribution should say who did the work.  The pull request record already
shows who authored and reviewed it, so crediting the human in the changelog
as well overstates their hand in it.

Records the rule in AGENTS.md and applies it to the two news fragments from
#7274, which are merged but unreleased.  The ``:user:`` role resolves to
https://github.com/%s, and github.com/claude is Anthropic's own account, so
the rendered link is correct.

Co-Authored-By: Claude Opus 5 <[email protected]>

* Add the implementation plan for the hashing substrate

Covers row 1 of the merge/concatenate roadmap: moving the array hashing
machinery out of _concatenate.py into a new private _combine_common.py.

Records the convention that a plan ships as its own pull request, ahead of
the implementation it describes.  A reviewer opening the implementation
pull request should see a diff they can hold in their head; a plan bundled
alongside is not evidence about the change, and makes a small diff look
like a large one.

Co-Authored-By: Claude Opus 5 <[email protected]>

* Add changelog fragment

Co-Authored-By: Claude Opus 5 <[email protected]>

* Correct the hashing substrate plan from implementation findings

Three corrections, all found by executing the plan rather than reading
it.

The import block was wrong.  `from __future__ import annotations` makes
`Mapping` annotation-only in Ruff's eyes, so `TC003` requires it behind
`TYPE_CHECKING`; `_concatenate.py` has no `__future__` import, so the
rule never fires there and copying the import across unchanged fails
lint.

The move is not quite mechanical.  Dropping the underscore from
`_array_id` collides with three local bindings inside `compute_hashes`
itself, not just the five call sites the plan already anticipated in
`_concatenate.py`.  Spell out the three, and say why the exception to
"do not otherwise touch the moved code" is narrower than it looks --
every one of the eight renames exists only to clear the unprefixed
name's path, so conceding decision 6 retires all of them at once.

Verification 1 therefore no longer expects an empty diff.  It expects
two hunks and three lines, which is a stronger check than "identical":
it names what may differ instead of asserting that nothing does.  The
`\b` anchors stay, with an accurate reason -- they change nothing over
lines 305-541, but protect `bound_array_id` if the range is ever
widened.

Co-Authored-By: Claude Opus 5 <[email protected]>

---------

Co-authored-by: Claude Opus 5 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Agentic benchmark_this Request that this pull request be benchmarked to check if it introduces performance shifts Feature: Merge/Concatenate Type: Feature Branch Highlight this for a feature branch

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant