diff options
author | Joel B. Mohler <joel@kiwistrawberry.us> | 2014-07-01 15:27:02 -0400 |
---|---|---|
committer | Joel B. Mohler <joel@kiwistrawberry.us> | 2014-07-03 10:39:08 -0400 |
commit | c8ae9eeccd9334c2fb9976067a6f1340e3f97752 (patch) | |
tree | b92199ff8c9d2f46d57b7378160aca42ff2dbd20 | |
parent | 46b8f472ffda16e584f54c8834efd2db55da07f9 (diff) | |
download | pint-c8ae9eeccd9334c2fb9976067a6f1340e3f97752.tar.gz |
rewrite get_dimensionality with compact recursion for performance
-rw-r--r-- | pint/unit.py | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/pint/unit.py b/pint/unit.py index 9802822..7ef47f7 100644 --- a/pint/unit.py +++ b/pint/unit.py @@ -885,9 +885,8 @@ class UnitRegistry(object): :param input_units: :return: dimensionality """ - dims = UnitsContainer() if not input_units: - return dims + return UnitsContainer() if isinstance(input_units, string_types): input_units = ParserHelper.from_string(input_units) @@ -895,25 +894,30 @@ class UnitRegistry(object): if input_units in self._dimensionality_cache: return copy.copy(self._dimensionality_cache[input_units]) - for key, value in input_units.items(): - if _is_dim(key): - reg = self._dimensions[key] - if reg.is_base: - dims.add(key, value) - else: - dims *= self.get_dimensionality(reg.reference) ** value - else: - reg = self._units[self.get_name(key)] - if reg.is_base: - dims *= reg.reference ** value - else: - dims *= self.get_dimensionality(reg.reference) ** value + accumulator = defaultdict(lambda: 0.0) + self._get_dimensionality_recurse(input_units, 1.0, accumulator) + + dims = UnitsContainer(dict((k, v) for k, v in accumulator.items() if v != 0.)) if '[]' in dims: del dims['[]'] return dims + def _get_dimensionality_recurse(self, ref, exp, accumulator): + for key, value in ref.items(): + exp2 = exp*value + if _is_dim(key): + reg = self._dimensions[key] + if reg.is_base: + accumulator[key] += exp2 + elif reg.reference != None: + self._get_dimensionality_recurse(reg.reference, exp2, accumulator) + else: + reg = self._units[self.get_name(key)] + if reg.reference != None: + self._get_dimensionality_recurse(reg.reference, exp2, accumulator) + def get_base_units(self, input_units, check_nonmult=True): """Convert unit or dict of units to the base units. |