Skip to content

Commit 5c7e01d

Browse files
committed
memoize simplified method for UnitQuantity, IrreducibleUnit and
Dimensionality. Yields about 20% decrease in time required to run the unit tests.
1 parent dd5ebdf commit 5c7e01d

7 files changed

Lines changed: 19 additions & 13 deletions

File tree

.eric4project/quantities.e4q

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<!DOCTYPE UserProject SYSTEM "UserProject-4.0.dtd">
33
<!-- eric4 user project file for project quantities -->
4-
<!-- Saved: 2009-02-15, 20:51:10 -->
4+
<!-- Saved: 2009-02-20, 20:45:01 -->
55
<!-- Copyright (C) 2009 , -->
66
<UserProject version="4.0">
77
</UserProject>

.eric4project/quantities.e4t

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<!DOCTYPE Tasks SYSTEM "Tasks-4.2.dtd">
33
<!-- eric4 tasks file for project quantities -->
4-
<!-- Saved: 2009-02-15, 20:51:10 -->
4+
<!-- Saved: 2009-02-20, 20:45:01 -->
55
<Tasks version="4.2">
66
<Task priority="1" completed="False" bugfix="False">
77
<Summary>TODO: move to constants</Summary>

quantities/dimensionality.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from .config import USE_UNICODE
1111
from .markup import format_units, format_units_unicode
1212
from .registry import unit_registry
13+
from .utilities import memoize
1314

1415
def assert_isinstance(obj, types):
1516
assert isinstance(obj, types), "arg %r does not match %s" % (obj, types)
@@ -25,6 +26,7 @@ def ndims(self):
2526
return sum(abs(i) for i in self.simplified.itervalues())
2627

2728
@property
29+
@memoize
2830
def simplified(self):
2931
if len(self):
3032
rq = 1*unit_registry['dimensionless']

quantities/markup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import re
88

99
from .config import USE_UNICODE
10+
1011
superscripts = ['⁰', '¹', '²', '³', '⁴', '⁵', '⁶', '⁷', '⁸', '⁹']
1112

1213
def superscript(val):

quantities/quantity.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ def dimensionality(self):
8080

8181
@property
8282
def _reference(self):
83+
"""The reference quantity used to perform conversions"""
8384
rq = 1*unit_registry['dimensionless']
8485
for u, d in self.dimensionality.iteritems():
8586
rq = rq * u._reference**d

quantities/unitquantity.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from .markup import superscript
1212
from .quantity import Quantity, get_conversion_factor
1313
from .registry import unit_registry
14-
from .utilities import with_doc
14+
from .utilities import memoize, with_doc
1515

1616

1717
__all__ = [
@@ -112,6 +112,7 @@ def definition(self):
112112
return self._definition
113113

114114
@property
115+
@memoize
115116
def simplified(self):
116117
return self._reference.simplified
117118

@@ -256,18 +257,10 @@ def __init__(
256257
if cls._default_unit is None:
257258
cls._default_unit = self
258259

259-
# cached:
260-
self._simplified = self._reference
261-
262260
@property
261+
@memoize
263262
def simplified(self):
264-
default_unit = type(self).get_default_unit()
265-
if self.dimensionality == default_unit.dimensionality:
266-
return self
267-
else:
268-
if self._simplified._dimensionality != default_unit.dimensionality:
269-
self._simplified = self.rescale(default_unit)
270-
return self._simplified
263+
return self.view(Quantity).rescale(self.get_default_unit())
271264

272265
@classmethod
273266
def get_default_unit(cls):

quantities/utilities.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,15 @@ def new_f(self, other):
1212
return check_accepts
1313

1414

15+
def memoize(f, cache={}):
16+
def g(*args, **kwargs):
17+
key = (f, tuple(args), frozenset(kwargs.items()))
18+
if key not in cache:
19+
cache[key] = f(*args, **kwargs)
20+
return cache[key]
21+
return g
22+
23+
1524
class with_doc:
1625

1726
"""

0 commit comments

Comments
 (0)