diff --git a/common/python/nomadcore/unit_conversion/unit_conversion.py b/common/python/nomadcore/unit_conversion/unit_conversion.py index f3d9b713e0781a58ed3a4226b6018a5816f1c653..8c71e6d60b523633a401417b0ea9f418b7794944 100644 --- a/common/python/nomadcore/unit_conversion/unit_conversion.py +++ b/common/python/nomadcore/unit_conversion/unit_conversion.py @@ -15,7 +15,18 @@ from pint import UnitRegistry logger = logging.getLogger(__name__) # disable warnings from pint logging.getLogger("pint").setLevel(logging.ERROR) + ureg = UnitRegistry(os.path.join(os.path.dirname(__file__), "units.txt")) +_ureg_cache = dict() + + +def ureg_cached(unit): + if unit in _ureg_cache: + return _ureg_cache[unit] + else: + unit_def = ureg(unit) + _ureg_cache[unit] = unit_def + return unit_def #=============================================================================== @@ -51,7 +62,7 @@ def convert_unit(value, unit, target_unit=None): """ # Check that the unit is valid - unit_def = ureg(unit) + unit_def = ureg_cached(unit) if not unit_def: logger.error("Undefined unit given. Cannot do the conversion") return @@ -64,7 +75,7 @@ def convert_unit(value, unit, target_unit=None): return converted_value.magnitude else: # Check that the given target unit is valid - target_unit_def = ureg(target_unit) + target_unit_def = ureg_cached(target_unit) if not target_unit_def: logger.error("Undefined target unit given. Cannot do the conversion") return @@ -95,9 +106,9 @@ def convert_unit_function_immediate(unit, target_unit=None): """ # Check that the dimensionality of the source and target units match. if target_unit is not None: - source = ureg(target_unit) + source = ureg_cached(target_unit) source_dim = source.dimensionality - target = ureg(unit) + target = ureg_cached(unit) target_dim = target.dimensionality if source_dim != target_dim: raise Exception("The dimensionality of unit '{}' does not match the dimensionality of unit '{}'. Cannot do the unit conversion.".format(unit, target_unit))