Skip to content
Snippets Groups Projects
Commit 97b17e91 authored by Martin Lange's avatar Martin Lange
Browse files

cache units compatibility and equivalence

parent 4bd14d02
No related branches found
No related tags found
1 merge request!229Cache units, compatibility and equivalence
Pipeline #133703 passed with stages
in 5 minutes and 32 seconds
......@@ -25,6 +25,8 @@ from .grid_tools import Grid, GridBase
pint_xarray.unit_registry.default_format = "cf"
UNITS = pint_xarray.unit_registry
_UNITS_CACHE = {}
def _gen_dims(ndim, info):
"""
......@@ -533,10 +535,14 @@ def compatible_units(unit1, unit2):
Returns
-------
bool
Uint compatibility.
Unit compatibility.
"""
unit1, unit2 = _get_pint_units(unit1), _get_pint_units(unit2)
return unit1.is_compatible_with(unit2)
comp_equiv = _UNITS_CACHE.get((unit1, unit2))
if comp_equiv is None:
comp_equiv = _cache_units(unit1, unit2)
return comp_equiv[0]
def equivalent_units(unit1, unit2):
......@@ -556,10 +562,29 @@ def equivalent_units(unit1, unit2):
Unit equivalence.
"""
unit1, unit2 = _get_pint_units(unit1), _get_pint_units(unit2)
comp_equiv = _UNITS_CACHE.get((unit1, unit2))
if comp_equiv is None:
comp_equiv = _cache_units(unit1, unit2)
return comp_equiv[1]
def _cache_units(unit1, unit2):
equiv = False
compat = False
try:
return np.isclose((1.0 * unit1).to(unit2).magnitude, 1.0)
equiv = np.isclose((1.0 * unit1).to(unit2).magnitude, 1.0)
compat = True
except pint.errors.DimensionalityError:
return False
pass
_UNITS_CACHE[(unit1, unit2)] = compat, equiv
return compat, equiv
def clear_units_cache():
"""Clears the units cache"""
_UNITS_CACHE.clear()
def assert_type(cls, slot, obj, types):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment