iris
iris copied to clipboard
Bugfix shape masking
🚀 Pull Request
Description
Fixes #6126 by exposing the shape geometry to the user. Adds to docs and docstrings to make it clearer how to use this.
Consult Iris pull request check list
Add any of the below labels to trigger actions on this PR:
- https://github.com/SciTools/iris/labels/benchmark_this
From @SciTools/peloton : discussed what we are seeing here and in #6126. We think this is looking useful, but the two of you seem to have it covered @hsteptoe @acchamber ? Please shout if you need help.
Discussion with @acchamber notes:
- Don't move imports out of functions as this creates circular import errors
- Check
target_crsassignment for occasion when cube doesn't have a CRS - Re-write conversion of 0-360 -> -180-180 coords in case of degree based CRSs
What are @SciTools/peloton (@pp-mo) thoughts about adding rasterio as a Iris dependency?
This would facilitate better handling of shapes to rasters (which is essentially the problem we're solving) with the added bonus that we could also mask to other shape types, like lines, to extract a trajectory from a Cube, for example.
I've had a few other discussions with other users now where they can't use this function with OSGB shapefiles which this PR would fix. Where are we on being able to include it in the next release?
@hsteptoe @pp-mo
I've had a few other discussions with other users now where they can't use this function with OSGB shapefiles which this PR would fix. Where are we on being able to include it in the next release?
@hsteptoe @pp-mo
I was planning on going to the AVD surgery this week to discuss some changes and/or make the case for rasterio
Thanks for your patience everyone. It's sometimes a struggle to balance everything and we just haven't had an opportunity to discuss this. Coming to the Surgery (UK Met Office) is an ideal next step.
@pp-mo, @trexfeathers and @stephenworsley have discussed this at the Surgery and agree in principle that we could consider adding rasterio as an optional dependency.
From @SciTools/peloton: would @hsteptoe and @acchamber appreciate any more input from core devs at this point?
From @SciTools/peloton: would @hsteptoe and @acchamber appreciate any more input from core devs at this point?
I just need to find more time, which is in short supply as we get near the end of FY...
This is now ready for some initial (alpha?) testing 🎉. @acchamber are you available to try out the new features? (Updates to docs etc. will follow if this is successful) Tests are incomplete are should not be review yet.
This is a fairly substantial re-write. New/improved features include:
- Automatic CRS transforms. Will handle situation where the cube and geometry have different CRSs by transforming the geometry.
- Handles all shape types, including Points, Lines and MultiPolygons.
There are some breaking changes, principally moving away from having a minimum_weight keyword, replacing it with an all_touched keyword. The rational here is for consistency across shape types. Minimum weight doesn't make sense for Points and Lines. Instead, Line pixilation is based on Bresenham's line algorithm. Polygon pixilation is based on either: (a) pixel centres that intersect the polygon, or (b) all pixels touched by the polygon irrespective of the area of intersection.
My informal tests so far show working behaviour for iris test data from rotated_pole.nc, toa_brightness_stereographic.nc, E1_north_america.nc, air_temp.pp. Know limitation (not-working) for semi-structured model grids, such as orca2_votemper.nc. Some test shapefiles 👉test_shapefiles.zip
I'll see if I can find the time to play around with this alpha in the next two weeks, to give some feedback, however I am concerned by the breaking changes here.
Being unable to mask the anti-meridian or the poles feels like a major flaw - As you've pointed out fixing it requires some guess of intention by the program of the user's desires, but a user being unable to mask shapes such as - Russia , The Pacific Ocean, The Arctic circle or Antarctica is a deteriment to many science workflows, especially when some of these do work in the current function.
I am also concerned about losing minimum_weight - while you are right it doesn't make sense for Points and Lines on the face of it, reducing functionality down from a user-adjustable spectrum to a binary choice does not fit the variety of scales shapefiles can have compared to model resolution - there's enough use cases that want an option between the two extremes of "touch the centre only or touch anywhere in the box". Especially if centred-touching is the default - it makes it quite possible for a user to mask a cube and receive a fully masked cube back for smaller shapefiles and not have a obvious answer as to why. I can see mimimum_weight becoming a optional keyword but could not support removing it completely.
I'll see if I can find the time to play around with this alpha in the next two weeks, to give some feedback, however I am concerned by the breaking changes here.
Being unable to mask the anti-meridian or the poles feels like a major flaw - As you've pointed out fixing it requires some guess of intention by the program of the user's desires, but a user being unable to mask shapes such as - Russia , The Pacific Ocean, The Arctic circle or Antarctica is a deteriment to many science workflows, especially when some of these do work in the current function.
I am also concerned about losing
minimum_weight- while you are right it doesn't make sense for Points and Lines on the face of it, reducing functionality down from a user-adjustable spectrum to a binary choice does not fit the variety of scales shapefiles can have compared to model resolution - there's enough use cases that want an option between the two extremes of "touch the centre only or touch anywhere in the box". Especially if centred-touching is the default - it makes it quite possible for a user to mask a cube and receive a fully masked cube back for smaller shapefiles and not have a obvious answer as to why. I can seemimimum_weightbecoming a optional keyword but could not support removing it completely.
Re. meridian crossing, I'll add some more shapefile test cases for the Arctic, Antarctic and Pacific Ocean. I think that so long as these are MultiPolygons divided across the meridian it will work fine. You say 'some' of these work in the current function. Can you be more specific about which use cases do and don't work? This isn't really a limitation with the masking function, but more a limitation of the way shapefiles are represented and the connection a shape has with its CRS. There is nothing by default to specify that a shapefile that straddles the 180th meridian should connect across the meridian because it exists in a cartesian coordinate frame which by default doesn't have a cyclic boundary condition. So really it's up to the user (not Iris) to make sure that the shapefile they use (or construct) correctly specifies how the meridian crossing should be handled.
Re. minimum_weight, in principal we could look at adding this back in, but I still question how much this is actually used. The all_touched implementation is consistent with rasterising approaches in other GIS applications (and consistent with the underlying rasterio API), but I agree that making all_touched default to True is a good call and would replicate the current default behaviour. My guess is that users either go with the default (minimum_weight=0) or minimum_weight=0.5... is anyone really ever choosing minimum_weight=0.3 or minimum_weight=0.8? It would be good to understand what these use cases might be if they are.
, I'll add some more shapefile test cases for the Arctic, Antarctic and Pacific Ocean. I think that so long as these are
MultiPolygonsdivided across the meridian it will work fine. You say 'some' of these work in the current function. Can you be more specific about which use cases do and don't work? This isn't really a limitation with the masking function, but more a limitation of the way shapefiles are represented and the connection a shape has with its CRS. There is nothing by default to specify that a shapefile that straddles the 180th meridian should connect across the meridian because it exists in a cartesian coordinate frame which by default doesn't have a cyclic boundary condition. So really it's up to the user (not Iris) to make sure that the shapefile they use (or construct) correctly specifies how the meridian crossing should be handled.
I know that Russia currently works in the current impletmentation with the "standard" Natural Earth shapefile. I have not actually checked for the Arctic/Antarctic, but I know there's active science that would need them to work, although I accept your point it's as much as about the shapefile construction as our impletmentation.
Re.
minimum_weight, in principal we could look at adding this back in, but I still question how much this is actually used. Theall_touchedimplementation is consistent with rasterising approaches in other GIS applications (and consistent with the underlyingrasterioAPI), but I agree that makingall_toucheddefault toTrueis a good call and would replicate the current default behaviour. My guess is that users either go with the default (minimum_weight=0) orminimum_weight=0.5... is anyone really ever choosingminimum_weight=0.3orminimum_weight=0.8? It would be good to understand what these use cases might be if they are.
I know I certainly am - it matters mostly when your grid resolution and your shapefile are similar magnitiudes - a good example being country-level masking on 1 degree or courser grids. You often get situations where a country is centred between grid boxes - being present in 20% of one, 30% of about, and 2% of a third as an example. Counting all the boxes equally is bad, but the shape doesn't nessacerily reach the centre of the boxes it is significantly in. Manual experimentation is required to find a suitable weight, doesn't mean it's not useful. You can also think of land-sea maskes and river watersheds for long-but-thin shapes. There's lots of different shapes you may use and data to apply them to, and assuming that all cases are covered by "all-touched" and centred-touching is reductive.
I know I certainly am - it matters mostly when your grid resolution and your shapefile are similar magnitiudes - a good example being country-level masking on 1 degree or courser grids. You often get situations where a country is centred between grid boxes - being present in 20% of one, 30% of about, and 2% of a third as an example. Counting all the boxes equally is bad, but the shape doesn't nessacerily reach the centre of the boxes it is significantly in. Manual experimentation is required to find a suitable weight, doesn't mean it's not useful. You can also think of land-sea maskes and river watersheds for long-but-thin shapes. There's lots of different shapes you may use and data to apply them to, and assuming that all cases are covered by "all-touched" and centred-touching is reductive.
It's not reductive if a users' choice of % isn't justifiable in the first place. Manual experimentation to find what 'looks right' isn't a robust or justifiable process when, by definition, going from vector -> raster involves a loss of fidelity. This requires a clear rule-based approach to this transform. A %-based approach can lead to voids in a raster. For a complex set of vectors that roughly sub-divide a grid cell equally (say, 30%-35%-35%), if a %-based threshold is poorly specified (say >= 40%) then the grid cell will fail to be selected and assigned to any of those rasterised vectors. A clear rule system (eg. centre-overlapping) will avoid this. This precedent exists across many rasterization implementations including things like OpenGL or ArcGIS. A %-based approach does not. I can see an argument for a rule based on >= 50% overlap, but only as a fixed choice rather than something to be tweaked by the user.
Also consider the Arakawa grid system used by numerical models... there is an understanding that a continuous physical property discretised onto a grid has to be assigned to a fixed point (on the centre or edge), even though we interpret this quantity as an integral over the grid box, ie. an area average. But again, this is based on a clear rule system: centres or edges.
Your concern with rasterising vectors onto coarse grid is simply an aliasing issue. A simple approach to anti-aliasing could be to weight the underlying raster by the proportion of the vector that overlaps it, but the weight needs to be carried through and applied to the raster at the point of masking, which doesn't happen in the current implementation, which is reductive in as much as it is limited to a True or False bool. An alternative approach that would make use of capability that already exists in Iris would be to regrid your underlying raster using a 1st-order conservative approach to a higher resolution that gives you the detail you need and then mask it using your vector (which I think is equivalent to the weighted anti-aliasing approach).
@hsteptoe was kind enough to bring this to a 'surgery' day at UK Met Office. Summary of my position, as the developer responsible for Iris:
- We love this detailed discussion in a publicly visible medium ❤
- We love the ownership and communication regarding upcoming releases, again all in public ❤ https://github.com/SciTools/iris/discussions/6307#discussioncomment-12223709
minimum_weight:- Can't be removed right now.
We know users are already relying on this. Removing such a feature would only be valid in a major release, or behind a
FUTUREflag. - Sceptical about removing in the future, too.
mask_cube_from_shapefile()aimed to provide the same functionality as the Met Office internal ASCEND package, allowing users to switch their scripts over.minimum_weightis part of this. - I'm OK with 'sidelining'
minimum_weight, freezing the functionality as it is now. It sounds like calling down to Rasterio, together with its alternative approach to intersections (any/centre/all covered) offers improvements that are incompatible with theminimum_weightapproach. I can therefore picture a check: ifminimum_weightis passed then call the 'legacy' code, otherwise call the proposed new code. This could also include new parameters formask_cube_from_shapefile()to better support the new functionality.
- Can't be removed right now.
We know users are already relying on this. Removing such a feature would only be valid in a major release, or behind a
Hey guys, we'd love to see this PR land in iris 3.13.
We're aiming to cut the candidate in early July and are spending most of May and June developing features for this release, so if you need help/advice or whatever then let us know and we'll be glad to help get this across the line 👍
Hey guys, we'd love to see this PR land in
iris3.13.We're aiming to cut the candidate in early July and are spending most of May and June developing features for this release, so if you need help/advice or whatever then let us know and we'll be glad to help get this across the line 👍
Thanks @bjlittle. Not finding much time for this at the moment, but still optimistic that I'll have more time to finalise this in May/June.
Hey guys, we'd love to see this PR land in
iris3.13. We're aiming to cut the candidate in early July and are spending most of May and June developing features for this release, so if you need help/advice or whatever then let us know and we'll be glad to help get this across the line 👍Thanks @bjlittle. Not finding much time for this at the moment, but still optimistic that I'll have more time to finalise this in May/June.
Due to other work commitments I'm going to have to bump this back for a later release 😢
Just commenting that I will be eager to use this when released! In the meantime it would be great if the documentation or code warned you that masking on the OSGB grid wasn't going to work as I spent quite a while trying to get it to work...
Just commenting that I will be eager to use this when released! In the meantime it would be great if the documentation or code warned you that masking on the OSGB grid wasn't going to work as I spent quite a while trying to get it to work...
@mo-DanCubbon If you have time, you could help test the changes when they are ready...
@trexfeathers @bjlittle I think this is ready for a first review... in particular I would appreciate reviews/help with
- Checking the logic of the mutually exclusive kwargs
minimum_weightandall_touched. Not sure if I've done this optimally - Explaining some of the CI/pre-commit failures... the numpydoc errors in particular are a bit opaque to me...
- Checking the best place to set a crucial
PROJenv variable (see b52a0d7)
@trexfeathers @bjlittle I think this is ready for a first review... in particular I would appreciate reviews/help with
- Checking the logic of the mutually exclusive kwargs
minimum_weightandall_touched. Not sure if I've done this optimally- Explaining some of the CI/pre-commit failures... the numpydoc errors in particular are a bit opaque to me...
- Checking the best place to set a crucial
PROJenv variable (see b52a0d7)
re. the PROJ variable, the last time I saw this come up was <URL> . Instead of having an SSL certificate problem, the proj transformation "succeeds" but actually fails silently and returns infinities.
@trexfeathers @bjlittle I think this is ready for a first review... in particular I would appreciate reviews/help with
- Checking the logic of the mutually exclusive kwargs
minimum_weightandall_touched. Not sure if I've done this optimally- Explaining some of the CI/pre-commit failures... the numpydoc errors in particular are a bit opaque to me...
- Checking the best place to set a crucial
PROJenv variable (see b52a0d7)re. the PROJ variable, the last time I saw this come up was
<URL>. Instead of having an SSL certificate problem, the proj transformation "succeeds" but actually fails silently and returns infinities.
@mo-DanCubbon only two-thirds of Iris devs will be able to view this link since it's internal to the UK Met Office. If there is any more detail you'd like to be visible it'll need to be posted verbatim.
@trexfeathers @bjlittle I think this is ready for a first review... in particular I would appreciate reviews/help with
- Checking the logic of the mutually exclusive kwargs
minimum_weightandall_touched. Not sure if I've done this optimally- Explaining some of the CI/pre-commit failures... the numpydoc errors in particular are a bit opaque to me...
- Checking the best place to set a crucial
PROJenv variable (see b52a0d7)re. the PROJ variable, the last time I saw this come up was
<URL>. Instead of having an SSL certificate problem, the proj transformation "succeeds" but actually fails silently and returns infinities.@mo-DanCubbon only two-thirds of Iris devs will be able to view this link since it's internal to the UK Met Office. If there is any more detail you'd like to be visible it'll need to be posted verbatim.
Details in that link were not super important, only that the network had to be switched off. We've investigated this a bit more, and have turned our PROJ_NETWORK back to on... but now we're getting the right answer. I'm assuming Proj has cached the necessary grid files to perform the transformation correctly now. I haven't since been able to reproduce the issue unfortunately but you could try with this:
from pyproj import Transformer
from cartopy import crs as ccrs
import pyproj.network
EASTING_NORTHING_EXAMPLE = (300000, 100000)
if __name__ == "__main__":
print(f"Is network enabled: {pyproj.network.is_network_enabled()}")
# First transform to OSGB
osgb_crs = ccrs.OSGB()
wgs84_crs = ccrs.PlateCarree()
transformer = Transformer.from_crs(osgb_crs, wgs84_crs, always_xy=True)
latlon = transformer.transform(*EASTING_NORTHING_EXAMPLE)
print(f"coordinates: {latlon}")
# Now disable network
pyproj.network.set_network_enabled(active=False)
print(f"Is network enabled after disabling: {pyproj.network.is_network_enabled()}")
# instantiate the transformer again
transformer = Transformer.from_crs(osgb_crs, wgs84_crs, always_xy=True)
latlon_no_network = transformer.transform(*EASTING_NORTHING_EXAMPLE)
print(f"coordinates without network: {latlon_no_network}")
@stephenworsley @trexfeathers Can you advise on apparently nox related errors that I'm seeing in the current CI failures, giving an error message: CondaHTTPError: HTTP 401 CONNECTION FAILED for url...
And, do you know why my local pre-commit version of numpydoc-validation might pass, but the github action one fails?
@stephenworsley @trexfeathers Can you advise on apparently
noxrelated errors that I'm seeing in the current CI failures, giving an error message:CondaHTTPError: HTTP 401 CONNECTION FAILED for url...And, do you know why my local pre-commit version of
numpydoc-validationmight pass, but the github action one fails?
@hsteptoe really sorry for missing this. There is a MO-specific step you will need to do for the lockfiles, will message you offline.
I'm less sure about pre-commit. There is some nuance about only testing files which have been edited; perhaps the merge from main means that your PR is changing more than your local branch was.
@stephenworsley @trexfeathers Can you advise on apparently
noxrelated errors that I'm seeing in the current CI failures, giving an error message:CondaHTTPError: HTTP 401 CONNECTION FAILED for url...And, do you know why my local pre-commit version ofnumpydoc-validationmight pass, but the github action one fails?@hsteptoe really sorry for missing this. There is a MO-specific step you will need to do for the lockfiles, will message you offline.
I'm less sure about pre-commit. There is some nuance about only testing files which have been edited; perhaps the merge from
mainmeans that your PR is changing more than your local branch was.
pre-commit related errors may have been something wrong going on with my pre-commit cache. Did a pre-commit clean and re-ran and that seemed to resolve the inconsistency issues.
Codecov Report
:x: Patch coverage is 98.40000% with 2 lines in your changes missing coverage. Please review.
:white_check_mark: Project coverage is 90.36%. Comparing base (af100e4) to head (dfb0847).
:warning: Report is 1 commits behind head on main.
| Files with missing lines | Patch % | Lines |
|---|---|---|
| lib/iris/_shapefiles.py | 98.26% | 0 Missing and 2 partials :warning: |
Additional details and impacted files
@@ Coverage Diff @@
## main #6129 +/- ##
==========================================
+ Coverage 90.30% 90.36% +0.05%
==========================================
Files 91 91
Lines 24674 24720 +46
Branches 4623 4632 +9
==========================================
+ Hits 22282 22337 +55
+ Misses 1620 1610 -10
- Partials 772 773 +1
:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.
:rocket: New features to boost your workflow:
- :snowflake: Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
:stopwatch: Performance Benchmark Report: b6002b85
Performance shifts
Full benchmark results
Benchmarks that have stayed the same:
| Change | Before [9c06cca1] | After [b6002b85] | Ratio | Benchmark (Parameter) |
|----------|----------------------|---------------------|---------|---------------------------------------------------------------------------------------------|
| | 20.7±0.2ms | 21.0±0.1ms | 1.01 | aggregate_collapse.Aggregation.time_aggregated_by_COUNT(False) |
| | 55.4±1ms | 56.4±0.5ms | 1.02 | aggregate_collapse.Aggregation.time_aggregated_by_COUNT(True) |
| | 34.3±0.2ms | 35.1±0.2ms | 1.02 | aggregate_collapse.Aggregation.time_aggregated_by_FAST_PERCENTILE(False) |
| | 193±3ms | 193±2ms | 1 | aggregate_collapse.Aggregation.time_aggregated_by_FAST_PERCENTILE(True) |
| | 22.7±0.1ms | 23.5±0.3ms | 1.04 | aggregate_collapse.Aggregation.time_aggregated_by_GMEAN(False) |
| | 33.9±0.7ms | 34.3±0.5ms | 1.01 | aggregate_collapse.Aggregation.time_aggregated_by_GMEAN(True) |
| | 22.7±0.2ms | 23.1±0.2ms | 1.02 | aggregate_collapse.Aggregation.time_aggregated_by_HMEAN(False) |
| | 33.9±0.3ms | 34.7±0.2ms | 1.02 | aggregate_collapse.Aggregation.time_aggregated_by_HMEAN(True) |
| | 20.5±0.2ms | 20.9±0.3ms | 1.02 | aggregate_collapse.Aggregation.time_aggregated_by_MAX(False) |
| | 46.5±0.7ms | 47.4±0.8ms | 1.02 | aggregate_collapse.Aggregation.time_aggregated_by_MAX(True) |
| | 124±0.4ms | 129±3ms | 1.04 | aggregate_collapse.Aggregation.time_aggregated_by_MAX_RUN(False) |
| | 128±1ms | 131±2ms | 1.02 | aggregate_collapse.Aggregation.time_aggregated_by_MAX_RUN(True) |
| | 21.6±0.2ms | 22.1±0.2ms | 1.02 | aggregate_collapse.Aggregation.time_aggregated_by_MEAN(False) |
| | 50.9±0.8ms | 52.0±2ms | 1.02 | aggregate_collapse.Aggregation.time_aggregated_by_MEAN(True) |
| | 23.1±0.3ms | 23.4±0.1ms | 1.01 | aggregate_collapse.Aggregation.time_aggregated_by_MEDIAN(False) |
| | 59.6±1ms | 60.4±1ms | 1.01 | aggregate_collapse.Aggregation.time_aggregated_by_MEDIAN(True) |
| | 20.5±0.3ms | 21.0±0.2ms | 1.02 | aggregate_collapse.Aggregation.time_aggregated_by_MIN(False) |
| | 46.8±0.6ms | 47.6±1ms | 1.02 | aggregate_collapse.Aggregation.time_aggregated_by_MIN(True) |
| | 1.07±0.01s | 1.08±0.01s | 1.01 | aggregate_collapse.Aggregation.time_aggregated_by_PEAK(False) |
| | 1.07±0.01s | 1.07±0.01s | 1.01 | aggregate_collapse.Aggregation.time_aggregated_by_PEAK(True) |
| | 217±2ms | 214±4ms | 0.99 | aggregate_collapse.Aggregation.time_aggregated_by_PERCENTILE(False) |
| | 377±8ms | 377±10ms | 1 | aggregate_collapse.Aggregation.time_aggregated_by_PERCENTILE(True) |
| | 21.5±0.2ms | 21.9±0.2ms | 1.02 | aggregate_collapse.Aggregation.time_aggregated_by_PROPORTION(False) |
| | 32.2±0.5ms | 32.7±0.6ms | 1.02 | aggregate_collapse.Aggregation.time_aggregated_by_PROPORTION(True) |
| | 21.9±0.3ms | 22.5±0.3ms | 1.03 | aggregate_collapse.Aggregation.time_aggregated_by_RMS(False) |
| | 61.3±0.8ms | 62.8±1ms | 1.02 | aggregate_collapse.Aggregation.time_aggregated_by_RMS(True) |
| | 22.8±0.3ms | 23.3±0.5ms | 1.03 | aggregate_collapse.Aggregation.time_aggregated_by_STD_DEV(False) |
| | 64.4±1ms | 65.4±2ms | 1.01 | aggregate_collapse.Aggregation.time_aggregated_by_STD_DEV(True) |
| | 22.4±0.3ms | 23.0±0.2ms | 1.03 | aggregate_collapse.Aggregation.time_aggregated_by_VARIANCE(False) |
| | 59.6±1ms | 60.8±0.9ms | 1.02 | aggregate_collapse.Aggregation.time_aggregated_by_VARIANCE(True) |
| | 7.87±0.1ms | 8.06±0.1ms | 1.02 | aggregate_collapse.Aggregation.time_collapsed_by_COUNT(False) |
| | 24.0±0.3ms | 24.2±0.8ms | 1.01 | aggregate_collapse.Aggregation.time_collapsed_by_COUNT(True) |
| | 19.6±0.2ms | 19.9±0.1ms | 1.02 | aggregate_collapse.Aggregation.time_collapsed_by_FAST_PERCENTILE(False) |
| | 145±2ms | 148±1ms | 1.02 | aggregate_collapse.Aggregation.time_collapsed_by_FAST_PERCENTILE(True) |
| | 8.20±0.2ms | 8.38±0.08ms | 1.02 | aggregate_collapse.Aggregation.time_collapsed_by_GMEAN(False) |
| | 22.1±0.5ms | 22.8±0.7ms | 1.03 | aggregate_collapse.Aggregation.time_collapsed_by_GMEAN(True) |
| | 8.25±0.1ms | 8.41±0.1ms | 1.02 | aggregate_collapse.Aggregation.time_collapsed_by_HMEAN(False) |
| | 22.0±0.4ms | 23.1±0.7ms | 1.05 | aggregate_collapse.Aggregation.time_collapsed_by_HMEAN(True) |
| | 7.73±0.1ms | 7.93±0.1ms | 1.02 | aggregate_collapse.Aggregation.time_collapsed_by_MAX(False) |
| | 22.9±0.6ms | 23.2±0.4ms | 1.02 | aggregate_collapse.Aggregation.time_collapsed_by_MAX(True) |
| | 24.5±0.4ms | 24.9±0.5ms | 1.02 | aggregate_collapse.Aggregation.time_collapsed_by_MAX_RUN(False) |
| | 36.8±0.5ms | 37.5±0.8ms | 1.02 | aggregate_collapse.Aggregation.time_collapsed_by_MAX_RUN(True) |
| | 7.98±0.1ms | 8.25±0.09ms | 1.03 | aggregate_collapse.Aggregation.time_collapsed_by_MEAN(False) |
| | 23.1±0.4ms | 23.3±0.5ms | 1.01 | aggregate_collapse.Aggregation.time_collapsed_by_MEAN(True) |
| | 9.02±0.1ms | 9.20±0.08ms | 1.02 | aggregate_collapse.Aggregation.time_collapsed_by_MEDIAN(False) |
| | 25.1±0.2ms | 26.0±0.7ms | 1.03 | aggregate_collapse.Aggregation.time_collapsed_by_MEDIAN(True) |
| | 7.72±0.1ms | 7.97±0.09ms | 1.03 | aggregate_collapse.Aggregation.time_collapsed_by_MIN(False) |
| | 22.9±0.5ms | 23.1±0.6ms | 1.01 | aggregate_collapse.Aggregation.time_collapsed_by_MIN(True) |
| | 526±1ms | 527±2ms | 1 | aggregate_collapse.Aggregation.time_collapsed_by_PEAK(False) |
| | 538±1ms | 539±2ms | 1 | aggregate_collapse.Aggregation.time_collapsed_by_PEAK(True) |
| | 45.2±0.6ms | 46.0±0.7ms | 1.02 | aggregate_collapse.Aggregation.time_collapsed_by_PERCENTILE(False) |
| | 159±3ms | 159±2ms | 1 | aggregate_collapse.Aggregation.time_collapsed_by_PERCENTILE(True) |
| | 8.10±0.1ms | 8.26±0.08ms | 1.02 | aggregate_collapse.Aggregation.time_collapsed_by_PROPORTION(False) |
| | 22.0±0.3ms | 22.1±0.5ms | 1.01 | aggregate_collapse.Aggregation.time_collapsed_by_PROPORTION(True) |
| | 8.07±0.1ms | 8.27±0.07ms | 1.03 | aggregate_collapse.Aggregation.time_collapsed_by_RMS(False) |
| | 25.4±0.8ms | 25.6±1ms | 1.01 | aggregate_collapse.Aggregation.time_collapsed_by_RMS(True) |
| | 8.22±0.1ms | 8.50±0.06ms | 1.03 | aggregate_collapse.Aggregation.time_collapsed_by_STD_DEV(False) |
| | 24.1±0.4ms | 24.7±0.4ms | 1.03 | aggregate_collapse.Aggregation.time_collapsed_by_STD_DEV(True) |
| | 8.33±0.1ms | 8.45±0.07ms | 1.01 | aggregate_collapse.Aggregation.time_collapsed_by_VARIANCE(False) |
| | 24.1±0.4ms | 24.2±0.3ms | 1 | aggregate_collapse.Aggregation.time_collapsed_by_VARIANCE(True) |
| | 22.3±0.3ms | 22.5±0.2ms | 1.01 | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_MEAN(False) |
| | 85.0±2ms | 84.9±1ms | 1 | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_MEAN(True) |
| | 22.1±0.1ms | 22.5±0.1ms | 1.02 | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_RMS(False) |
| | 98.4±2ms | 98.2±2ms | 1 | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_RMS(True) |
| | 20.8±0.09ms | 21.3±0.2ms | 1.02 | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_SUM(False) |
| | 57.4±0.8ms | 58.5±1ms | 1.02 | aggregate_collapse.WeightedAggregation.time_w_aggregated_by_SUM(True) |
| | 8.37±0.09ms | 8.49±0.09ms | 1.01 | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_MEAN(False) |
| | 29.4±0.7ms | 30.3±0.7ms | 1.03 | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_MEAN(True) |
| | 8.30±0.07ms | 8.34±0.1ms | 1 | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_RMS(False) |
| | 30.6±0.6ms | 31.0±0.6ms | 1.01 | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_RMS(True) |
| | 8.02±0.08ms | 8.10±0.07ms | 1.01 | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_SUM(False) |
| | 24.7±0.8ms | 24.8±0.8ms | 1 | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_SUM(True) |
| | 221±1ms | 226±4ms | 1.02 | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_WPERCENTILE(False) |
| | 307±2ms | 308±4ms | 1 | aggregate_collapse.WeightedAggregation.time_w_collapsed_by_WPERCENTILE(True) |
| | 1.11±0.01ms | 1.14±0.01ms | 1.03 | cube.CubeCreation.time_create(False, 'construct') |
| | 386±7μs | 398±5μs | 1.03 | cube.CubeCreation.time_create(False, 'instantiate') |
| | 1.94±0.03ms | 1.98±0.02ms | 1.02 | cube.CubeCreation.time_create(True, 'construct') |
| | 1.37±0.02ms | 1.40±0.01ms | 1.02 | cube.CubeCreation.time_create(True, 'instantiate') |
| | 90.1±2ms | 89.0±1ms | 0.99 | cube.CubeEquality.time_equality(False, False, 'all_equal') |
| | 24.5±0.2ms | 25.2±2ms | 1.03 | cube.CubeEquality.time_equality(False, False, 'coord_inequality') |
| | 103±2ms | 103±2ms | 1 | cube.CubeEquality.time_equality(False, False, 'data_inequality') |
| | 16.4±0.2μs | 17.0±0.2μs | 1.03 | cube.CubeEquality.time_equality(False, False, 'metadata_inequality') |
| | 93.3±1ms | 92.8±1ms | 0.99 | cube.CubeEquality.time_equality(False, True, 'all_equal') |
| | 27.9±0.5ms | 28.6±0.9ms | 1.03 | cube.CubeEquality.time_equality(False, True, 'coord_inequality') |
| | 108±1ms | 106±1ms | 0.99 | cube.CubeEquality.time_equality(False, True, 'data_inequality') |
| | 16.2±0.2μs | 16.8±0.2μs | 1.03 | cube.CubeEquality.time_equality(False, True, 'metadata_inequality') |
| | 200±6ms | 196±2ms | 0.98 | cube.CubeEquality.time_equality(True, False, 'all_equal') |
| | 80.2±1ms | 80.3±0.8ms | 1 | cube.CubeEquality.time_equality(True, False, 'coord_inequality') |
| | 229±4ms | 225±1ms | 0.98 | cube.CubeEquality.time_equality(True, False, 'data_inequality') |
| | 51.0±0.4μs | 52.8±0.6μs | 1.03 | cube.CubeEquality.time_equality(True, False, 'metadata_inequality') |
| | 297±7ms | 290±2ms | 0.98 | cube.CubeEquality.time_equality(True, True, 'all_equal') |
| | 178±6ms | 174±1ms | 0.98 | cube.CubeEquality.time_equality(True, True, 'coord_inequality') |
| | 328±7ms | 318±3ms | 0.97 | cube.CubeEquality.time_equality(True, True, 'data_inequality') |
| | 366±4μs | 375±5μs | 1.02 | cube.CubeEquality.time_equality(True, True, 'metadata_inequality') |
| | 798±9μs | 795±6μs | 1 | import_iris.Iris.time__concatenate |
| | 186±2μs | 185±1μs | 1 | import_iris.Iris.time__constraints |
| | 114±1μs | 115±0.9μs | 1.01 | import_iris.Iris.time__data_manager |
| | 92.0±0.3μs | 92.6±1μs | 1.01 | import_iris.Iris.time__deprecation |
| | 162±5μs | 163±1μs | 1 | import_iris.Iris.time__lazy_data |
| | 905±10μs | 913±10μs | 1.01 | import_iris.Iris.time__merge |
| | 73.1±0.4μs | 76.5±1μs | 1.05 | import_iris.Iris.time__representation |
| | 607±8μs | 609±4μs | 1 | import_iris.Iris.time_analysis |
| | 141±2μs | 142±1μs | 1.01 | import_iris.Iris.time_analysis__area_weighted |
| | 106±1μs | 108±3μs | 1.01 | import_iris.Iris.time_analysis__grid_angles |
| | 247±2μs | 250±2μs | 1.01 | import_iris.Iris.time_analysis__interpolation |
| | 192±3μs | 194±3μs | 1.01 | import_iris.Iris.time_analysis__regrid |
| | 111±1μs | 110±1μs | 1 | import_iris.Iris.time_analysis__scipy_interpolate |
| | 139±3μs | 138±2μs | 0.99 | import_iris.Iris.time_analysis_calculus |
| | 324±3μs | 324±2μs | 1 | import_iris.Iris.time_analysis_cartography |
| | 89.8±0.7μs | 94.5±0.6μs | 1.05 | import_iris.Iris.time_analysis_geomerty |
| | 211±2μs | 213±3μs | 1.01 | import_iris.Iris.time_analysis_maths |
| | 96.1±9μs | 95.4±0.5μs | 0.99 | import_iris.Iris.time_analysis_stats |
| | 170±1μs | 174±3μs | 1.02 | import_iris.Iris.time_analysis_trajectory |
| | 323±5μs | 324±4μs | 1 | import_iris.Iris.time_aux_factory |
| | 79.9±0.5μs | 82.0±2μs | 1.03 | import_iris.Iris.time_common |
| | 160±3μs | 161±1μs | 1.01 | import_iris.Iris.time_common_lenient |
| | 1.35±0.01ms | 1.35±0.01ms | 1 | import_iris.Iris.time_common_metadata |
| | 169±2μs | 168±2μs | 1 | import_iris.Iris.time_common_mixin |
| | 1.16±0.01ms | 1.17±0.01ms | 1.01 | import_iris.Iris.time_common_resolve |
| | 197±2μs | 200±2μs | 1.01 | import_iris.Iris.time_config |
| | 130±1μs | 128±1μs | 0.99 | import_iris.Iris.time_coord_categorisation |
| | 380±8μs | 379±2μs | 1 | import_iris.Iris.time_coord_systems |
| | 769±10μs | 763±5μs | 0.99 | import_iris.Iris.time_coords |
| | 691±20μs | 682±3μs | 0.99 | import_iris.Iris.time_cube |
| | 245±3μs | 244±2μs | 0.99 | import_iris.Iris.time_exceptions |
| | 73.3±0.2μs | 74.8±0.7μs | 1.02 | import_iris.Iris.time_experimental |
| | 179±1μs | 181±2μs | 1.01 | import_iris.Iris.time_fileformats |
| | 258±5μs | 258±3μs | 1 | import_iris.Iris.time_fileformats__ff |
| | 2.51±0.04ms | 2.55±0.01ms | 1.01 | import_iris.Iris.time_fileformats__ff_cross_references |
| | 76.4±1μs | 77.1±1μs | 1.01 | import_iris.Iris.time_fileformats__pp_lbproc_pairs |
| | 113±1μs | 114±2μs | 1.01 | import_iris.Iris.time_fileformats_abf |
| | 443±5μs | 441±4μs | 1 | import_iris.Iris.time_fileformats_cf |
| | 4.70±0.2ms | 4.76±0.04ms | 1.01 | import_iris.Iris.time_fileformats_dot |
| | 72.8±0.9μs | 72.1±0.9μs | 0.99 | import_iris.Iris.time_fileformats_name |
| | 249±2μs | 253±2μs | 1.01 | import_iris.Iris.time_fileformats_name_loaders |
| | 115±2μs | 117±2μs | 1.02 | import_iris.Iris.time_fileformats_netcdf |
| | 121±2μs | 121±0.6μs | 1 | import_iris.Iris.time_fileformats_nimrod |
| | 207±3μs | 208±2μs | 1.01 | import_iris.Iris.time_fileformats_nimrod_load_rules |
| | 794±7μs | 799±7μs | 1.01 | import_iris.Iris.time_fileformats_pp |
| | 183±3μs | 190±6μs | 1.04 | import_iris.Iris.time_fileformats_pp_load_rules |
| | 137±3μs | 138±1μs | 1.01 | import_iris.Iris.time_fileformats_pp_save_rules |
| | 540±3μs | 541±3μs | 1 | import_iris.Iris.time_fileformats_rules |
| | 218±3μs | 222±6μs | 1.02 | import_iris.Iris.time_fileformats_structured_array_identification |
| | 79.7±0.8μs | 80.8±1μs | 1.01 | import_iris.Iris.time_fileformats_um |
| | 158±2μs | 158±4μs | 1 | import_iris.Iris.time_fileformats_um__fast_load |
| | 139±2μs | 138±2μs | 1 | import_iris.Iris.time_fileformats_um__fast_load_structured_fields |
| | 71.9±0.9μs | 74.0±0.7μs | 1.03 | import_iris.Iris.time_fileformats_um__ff_replacement |
| | 77.1±1μs | 78.7±0.7μs | 1.02 | import_iris.Iris.time_fileformats_um__optimal_array_structuring |
| | 946±20μs | 942±9μs | 1 | import_iris.Iris.time_fileformats_um_cf_map |
| | 136±2μs | 137±1μs | 1.01 | import_iris.Iris.time_io |
| | 180±5μs | 177±1μs | 0.98 | import_iris.Iris.time_io_format_picker |
| | 210±2μs | 214±0.6μs | 1.02 | import_iris.Iris.time_iris |
| | 126±3μs | 126±0.8μs | 0.99 | import_iris.Iris.time_iterate |
| | 8.09±0.08ms | 8.12±0.05ms | 1 | import_iris.Iris.time_palette |
| | 1.76±0.01ms | 1.80±0.02ms | 1.02 | import_iris.Iris.time_plot |
| | 219±3μs | 221±2μs | 1.01 | import_iris.Iris.time_quickplot |
| | 2.11±0.05ms | 2.14±0.02ms | 1.02 | import_iris.Iris.time_std_names |
| | 1.81±0.04ms | 1.82±0.01ms | 1.01 | import_iris.Iris.time_symbols |
| | 108±1ms | 107±0.7ms | 0.99 | import_iris.Iris.time_tests |
| | 251±6μs | 257±3μs | 1.02 | import_iris.Iris.time_third_party_cartopy |
| | 5.07±0.04ms | 5.07±0.03ms | 1 | import_iris.Iris.time_third_party_cf_units |
| | 116±0.8μs | 117±2μs | 1.01 | import_iris.Iris.time_third_party_cftime |
| | 2.71±0.05ms | 2.72±0.04ms | 1 | import_iris.Iris.time_third_party_matplotlib |
| | 1.32±0ms | 1.34±0.01ms | 1.02 | import_iris.Iris.time_third_party_numpy |
| | 168±2μs | 170±1μs | 1.02 | import_iris.Iris.time_third_party_scipy |
| | 99.8±1μs | 99.8±1μs | 1 | import_iris.Iris.time_time |
| | 848±5μs | 864±5μs | 1.02 | import_iris.Iris.time_util |
| | 70.6±0.6μs | 73.9±0.7μs | 1.05 | iterate.IZip.time_izip |
| | 10.0±0.09ms | 10.1±0.05ms | 1 | load.LoadAndRealise.time_load((1280, 960, 5), False, 'FF') |
| | 18.3±0.2ms | 18.4±0.5ms | 1.01 | load.LoadAndRealise.time_load((1280, 960, 5), False, 'NetCDF') |
| | 9.94±0.03ms | 10.4±0.1ms | 1.04 | load.LoadAndRealise.time_load((1280, 960, 5), False, 'PP') |
| | 9.91±0.1ms | 10.2±0.1ms | 1.03 | load.LoadAndRealise.time_load((1280, 960, 5), True, 'FF') |
| | 15.7±0.3ms | 15.8±0.05ms | 1.01 | load.LoadAndRealise.time_load((1280, 960, 5), True, 'NetCDF') |
| | 10.0±0.04ms | 10.2±0.07ms | 1.02 | load.LoadAndRealise.time_load((1280, 960, 5), True, 'PP') |
| | 1.50±0.01s | 1.51±0s | 1.01 | load.LoadAndRealise.time_load((2, 2, 1000), False, 'FF') |
| | 14.5±0.09ms | 14.9±0.3ms | 1.03 | load.LoadAndRealise.time_load((2, 2, 1000), False, 'NetCDF') |
| | 1.51±0s | 1.53±0.02s | 1.01 | load.LoadAndRealise.time_load((2, 2, 1000), False, 'PP') |
| | 1.47±0.01s | 1.52±0.01s | 1.03 | load.LoadAndRealise.time_load((2, 2, 1000), True, 'FF') |
| | 14.6±0.09ms | 14.6±0.1ms | 1 | load.LoadAndRealise.time_load((2, 2, 1000), True, 'NetCDF') |
| | 1.53±0.01s | 1.54±0.01s | 1.01 | load.LoadAndRealise.time_load((2, 2, 1000), True, 'PP') |
| | 5.29±0.02ms | 5.47±0.04ms | 1.03 | load.LoadAndRealise.time_load((50, 50, 2), False, 'FF') |
| | 14.1±0.1ms | 14.4±0.2ms | 1.02 | load.LoadAndRealise.time_load((50, 50, 2), False, 'NetCDF') |
| | 5.23±0.04ms | 5.41±0.06ms | 1.03 | load.LoadAndRealise.time_load((50, 50, 2), False, 'PP') |
| | 5.29±0.06ms | 5.38±0.03ms | 1.02 | load.LoadAndRealise.time_load((50, 50, 2), True, 'FF') |
| | 14.3±0.2ms | 14.5±0.1ms | 1.01 | load.LoadAndRealise.time_load((50, 50, 2), True, 'NetCDF') |
| | 5.25±0.04ms | 5.37±0.03ms | 1.02 | load.LoadAndRealise.time_load((50, 50, 2), True, 'PP') |
| | 24.3±1ms | 22.9±1ms | 0.94 | load.LoadAndRealise.time_realise((1280, 960, 5), False, 'FF') |
| | 26.3±0.8ms | 26.2±0.8ms | 1 | load.LoadAndRealise.time_realise((1280, 960, 5), False, 'NetCDF') |
| | 12.7±1ms | 12.3±0.5ms | 0.97 | load.LoadAndRealise.time_realise((1280, 960, 5), False, 'PP') |
| | 28.7±1ms | 28.3±1ms | 0.98 | load.LoadAndRealise.time_realise((1280, 960, 5), True, 'FF') |
| | 96.4±0.6ms | 95.8±0.6ms | 0.99 | load.LoadAndRealise.time_realise((1280, 960, 5), True, 'NetCDF') |
| | 27.8±1ms | 28.1±1ms | 1.01 | load.LoadAndRealise.time_realise((1280, 960, 5), True, 'PP') |
| | 597±2ms | 608±2ms | 1.02 | load.LoadAndRealise.time_realise((2, 2, 1000), False, 'FF') |
| | 5.43±0.2ms | 5.55±0.09ms | 1.02 | load.LoadAndRealise.time_realise((2, 2, 1000), False, 'NetCDF') |
| | 601±5ms | 607±2ms | 1.01 | load.LoadAndRealise.time_realise((2, 2, 1000), False, 'PP') |
| | 615±6ms | 614±3ms | 1 | load.LoadAndRealise.time_realise((2, 2, 1000), True, 'FF') |
| | 5.61±0.3ms | 5.54±0.09ms | 0.99 | load.LoadAndRealise.time_realise((2, 2, 1000), True, 'NetCDF') |
| | 609±9ms | 612±3ms | 1 | load.LoadAndRealise.time_realise((2, 2, 1000), True, 'PP') |
| | 2.07±0.08ms | 2.18±0.06ms | 1.05 | load.LoadAndRealise.time_realise((50, 50, 2), False, 'FF') |
| | 5.45±0.08ms | 5.57±0.2ms | 1.02 | load.LoadAndRealise.time_realise((50, 50, 2), False, 'NetCDF') |
| | 2.02±0.06ms | 2.08±0.04ms | 1.03 | load.LoadAndRealise.time_realise((50, 50, 2), False, 'PP') |
| | 2.08±0.07ms | 2.09±0.03ms | 1.01 | load.LoadAndRealise.time_realise((50, 50, 2), True, 'FF') |
| | 5.59±0.2ms | 5.70±0.2ms | 1.02 | load.LoadAndRealise.time_realise((50, 50, 2), True, 'NetCDF') |
| | 2.04±0.06ms | 2.12±0.04ms | 1.04 | load.LoadAndRealise.time_realise((50, 50, 2), True, 'PP') |
| | 344±6ms | 345±2ms | 1.01 | load.ManyCubes.time_many_cube_load |
| | 88.3±2ms | 89.7±0.6ms | 1.02 | load.ManyVars.time_many_var_load |
| | 10.0±0.04ms | 10.2±0.05ms | 1.02 | load.STASHConstraint.time_stash_constraint((1280, 960, 5), 'FF') |
| | 10.1±0.2ms | 10.3±0.1ms | 1.02 | load.STASHConstraint.time_stash_constraint((1280, 960, 5), 'PP') |
| | 1.51±0.01s | 1.54±0.01s | 1.02 | load.STASHConstraint.time_stash_constraint((2, 2, 1000), 'FF') |
| | 1.54±0.02s | 1.56±0.01s | 1.01 | load.STASHConstraint.time_stash_constraint((2, 2, 1000), 'PP') |
| | 5.31±0.02ms | 5.45±0.02ms | 1.03 | load.STASHConstraint.time_stash_constraint((2, 2, 2), 'FF') |
| | 5.31±0.09ms | 5.39±0.04ms | 1.02 | load.STASHConstraint.time_stash_constraint((2, 2, 2), 'PP') |
| | 9.06±0.1ms | 9.06±0.1ms | 1 | load.StructuredFF.time_structured_load((1280, 960, 5), False) |
| | 5.59±0.08ms | 5.70±0.03ms | 1.02 | load.StructuredFF.time_structured_load((1280, 960, 5), True) |
| | 1.47±0.01s | 1.51±0.01s | 1.02 | load.StructuredFF.time_structured_load((2, 2, 1000), False) |
| | 417±6ms | 427±6ms | 1.02 | load.StructuredFF.time_structured_load((2, 2, 1000), True) |
| | 4.37±0.02ms | 4.51±0.04ms | 1.03 | load.StructuredFF.time_structured_load((2, 2, 2), False) |
| | 4.18±0.02ms | 4.31±0.04ms | 1.03 | load.StructuredFF.time_structured_load((2, 2, 2), True) |
| | 153±4ms | 157±1ms | 1.03 | load.TimeConstraint.time_time_constraint(20, 'FF') |
| | 17.3±0.5ms | 17.5±0.2ms | 1.01 | load.TimeConstraint.time_time_constraint(20, 'NetCDF') |
| | 156±2ms | 156±0.4ms | 1 | load.TimeConstraint.time_time_constraint(20, 'PP') |
| | 31.0±0.2ms | 31.2±0.3ms | 1.01 | load.TimeConstraint.time_time_constraint(3, 'FF') |
| | 17.0±0.5ms | 17.2±0.2ms | 1.01 | load.TimeConstraint.time_time_constraint(3, 'NetCDF') |
| | 31.1±0.3ms | 31.6±0.1ms | 1.01 | load.TimeConstraint.time_time_constraint(3, 'PP') |
| | 21.3±0.2ms | 21.3±0.4ms | 1 | load.ugrid.BasicLoading.time_load_file(1) |
| | 53.6±0.9ms | 53.3±0.5ms | 0.99 | load.ugrid.BasicLoading.time_load_file(200000) |
| | 11.3±0.2ms | 11.0±0.08ms | 0.98 | load.ugrid.BasicLoading.time_load_mesh(1) |
| | 21.1±1ms | 20.8±0.3ms | 0.99 | load.ugrid.BasicLoading.time_load_mesh(200000) |
| | 21.2±0.7ms | 21.3±0.2ms | 1.01 | load.ugrid.BasicLoadingTime.time_load_file(1) |
| | 22.2±0.8ms | 21.7±0.2ms | 0.98 | load.ugrid.BasicLoadingTime.time_load_file(200000) |
| | 11.2±0.1ms | 11.1±0.3ms | 0.99 | load.ugrid.BasicLoadingTime.time_load_mesh(1) |
| | 14.5±0.6ms | 14.1±0.2ms | 0.97 | load.ugrid.BasicLoadingTime.time_load_mesh(200000) |
| | 23.9±0.4ms | 23.9±0.2ms | 1 | load.ugrid.Callback.time_load_file_callback(1) |
| | 65.3±1ms | 66.4±0.4ms | 1.02 | load.ugrid.Callback.time_load_file_callback(200000) |
| | 23.6±0.5ms | 23.7±0.3ms | 1.01 | load.ugrid.CallbackTime.time_load_file_callback(1) |
| | 25.4±0.6ms | 25.2±0.3ms | 0.99 | load.ugrid.CallbackTime.time_load_file_callback(200000) |
| | 5.59±0.3ms | 5.48±0.2ms | 0.98 | load.ugrid.DataRealisation.time_realise_data(10000) |
| | 8.41±0.3ms | 8.54±0.09ms | 1.02 | load.ugrid.DataRealisation.time_realise_data(200000) |
| | 40.6±2ms | 40.0±2ms | 0.99 | load.ugrid.DataRealisationTime.time_realise_data(10000) |
| | 805±8ms | 798±20ms | 0.99 | load.ugrid.DataRealisationTime.time_realise_data(200000) |
| | 1.44±0.04s | 1.41±0.03s | 0.98 | merge_concat.Concatenate.time_concatenate(False) |
| | 449±7ms | 450±3ms | 1 | merge_concat.Concatenate.time_concatenate(True) |
| | 2.42±0G | 2.42±0G | 1 | merge_concat.Concatenate.tracemalloc_concatenate(False) |
| | 110±4M | 110±2M | 1 | merge_concat.Concatenate.tracemalloc_concatenate(True) |
| | 38.1±1ms | 34.8±1ms | 0.91 | merge_concat.Merge.time_merge |
| | 126±0.03M | 126±0.03M | 1 | merge_concat.Merge.tracemalloc_merge |
| | 362±2ns | 383±4ns | 1.06 | mesh.utils.regions_combine.CombineRegionsComputeRealData.time_compute_data(50) |
| | 197±1ms | 199±2ms | 1.01 | mesh.utils.regions_combine.CombineRegionsComputeRealData.time_compute_data(500) |
| | 771±0.5k | 771±0.5k | 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) |
| | 18.9±0.2ms | 19.1±0.2ms | 1.01 | mesh.utils.regions_combine.CombineRegionsCreateCube.time_create_combined_cube(50) |
| | 22.4±0.2ms | 22.6±0.3ms | 1.01 | mesh.utils.regions_combine.CombineRegionsCreateCube.time_create_combined_cube(500) |
| | 1.27±0.04M | 1.27±0.04M | 1 | mesh.utils.regions_combine.CombineRegionsCreateCube.tracemalloc_create_combined_cube(50) |
| | 25±0.04M | 25±0.04M | 1 | mesh.utils.regions_combine.CombineRegionsCreateCube.tracemalloc_create_combined_cube(500) |
| | 174±3ms | 176±5ms | 1.01 | mesh.utils.regions_combine.CombineRegionsFileStreamedCalc.time_stream_file2file(50) |
| | 649±4ms | 650±9ms | 1 | mesh.utils.regions_combine.CombineRegionsFileStreamedCalc.time_stream_file2file(500) |
| | 1.49±0.03M | 1.49±0.03M | 1 | mesh.utils.regions_combine.CombineRegionsFileStreamedCalc.tracemalloc_stream_file2file(50) |
| | 96.5±0.03M | 96.5±0.02M | 1 | mesh.utils.regions_combine.CombineRegionsFileStreamedCalc.tracemalloc_stream_file2file(500) |
| | 121±1ms | 122±2ms | 1.01 | mesh.utils.regions_combine.CombineRegionsSaveData.time_save(50) |
| | 588±4ms | 587±5ms | 1 | mesh.utils.regions_combine.CombineRegionsSaveData.time_save(500) |
| | 1.43±0.02M | 1.43±0.02M | 1 | mesh.utils.regions_combine.CombineRegionsSaveData.tracemalloc_save(50) |
| | 96.5±0.03M | 96.5±0.03M | 1 | mesh.utils.regions_combine.CombineRegionsSaveData.tracemalloc_save(500) |
| | 2.1752849999999997 | 2.1752849999999997 | 1 | mesh.utils.regions_combine.CombineRegionsSaveData.track_filesize_saved(50) |
| | 216.01528499999998 | 216.01528499999998 | 1 | mesh.utils.regions_combine.CombineRegionsSaveData.track_filesize_saved(500) |
| | 6.54±0.3ms | 6.62±0.1ms | 1.01 | plot.AuxSort.time_aux_sort |
| | 85.1±4ms | 85.9±3ms | 1.01 | regridding.CurvilinearRegridding.time_regrid_pic |
| | 136±3M | 136±3M | 1 | regridding.CurvilinearRegridding.tracemalloc_regrid_pic |
| | 108±7ms | 106±7ms | 0.99 | regridding.HorizontalChunkedRegridding.time_regrid_area_w |
| | 61.5±3ms | 66.0±3ms | 1.07 | regridding.HorizontalChunkedRegridding.time_regrid_area_w_new_grid |
| | 107±0.08M | 107±0.09M | 1 | regridding.HorizontalChunkedRegridding.tracemalloc_regrid_area_w |
| | 147±0.04M | 147±0.04M | 1 | regridding.HorizontalChunkedRegridding.tracemalloc_regrid_area_w_new_grid |
| | 6.84±0.3ms | 6.73±0.05ms | 0.98 | save.NetcdfSave.time_netcdf_save_cube(50, False) |
| | 122±4ms | 123±0.4ms | 1.01 | save.NetcdfSave.time_netcdf_save_cube(50, True) |
| | 44.8±0.5ms | 44.5±0.7ms | 0.99 | save.NetcdfSave.time_netcdf_save_cube(600, False) |
| | 521±4ms | 523±4ms | 1 | save.NetcdfSave.time_netcdf_save_cube(600, True) |
| | 94.8±7ns | 92.1±1ns | 0.97 | save.NetcdfSave.time_netcdf_save_mesh(50, False) |
| | 101±0.9ms | 102±0.7ms | 1.01 | save.NetcdfSave.time_netcdf_save_mesh(50, True) |
| | 95.5±9ns | 91.7±3ns | 0.96 | save.NetcdfSave.time_netcdf_save_mesh(600, False) |
| | 466±7ms | 467±5ms | 1 | save.NetcdfSave.time_netcdf_save_mesh(600, True) |
| | 31.7±0.4k | 31.9±0.3k | 1 | save.NetcdfSave.tracemalloc_netcdf_save(50, False) |
| | 1.9±0.2M | 1.84±0.1M | 0.97 | save.NetcdfSave.tracemalloc_netcdf_save(50, True) |
| | 31.8±0.5k | 31.8±0.3k | 1 | save.NetcdfSave.tracemalloc_netcdf_save(600, False) |
| | 225±20M | 208±20M | 0.92 | save.NetcdfSave.tracemalloc_netcdf_save(600, True) |
| | 39.4±0.6ms | 39.6±0.4ms | 1.01 | stats.PearsonR.time_lazy |
| | 9.45±0.2ms | 9.46±0.3ms | 1 | stats.PearsonR.time_real |
| | 29.4±0.9M | 29.4±0.6M | 1 | stats.PearsonR.tracemalloc_lazy |
| | 18.3±0.01M | 18.3±0.01M | 1 | stats.PearsonR.tracemalloc_real |
| | 27.5±0.5ms | 27.9±0.5ms | 1.01 | trajectory.TrajectoryInterpolation.time_trajectory_linear |
| | 64.1±0.3ms | 65.4±0.5ms | 1.02 | trajectory.TrajectoryInterpolation.time_trajectory_nearest |
| | 17.6±0.02M | 17.6±0.02M | 1 | trajectory.TrajectoryInterpolation.tracemalloc_trajectory_linear |
| | 7.75±0.02M | 7.75±0.02M | 1 | trajectory.TrajectoryInterpolation.tracemalloc_trajectory_nearest |
Generated by GHA run 18778161660