Memoize (Class-Based Memoization)
Per-instance memoization for class methods with full type hint and docstring preservation.
Overview
gri-memoize provides a MemoizedClass base class and a @memoize decorator for caching method results within class instances. Unlike functools.lru_cache, which stores results in a global cache tied to the function object, gri-memoize keeps cached results on each instance -- so garbage collection, per-instance invalidation, and IDE tooling all work as expected.
Requires Python 3.12+.
Documentation
The wheel ships its documentation inside the package, in gri_memoize/docs/,
so it is available wherever the package is installed:
overview.md-- usage, cache invalidation, and gotchasapi_summary.md-- every public name and signature (generated)
Print the directory with
python -c "import gri_memoize, pathlib; print(pathlib.Path(gri_memoize.__file__).parent / 'docs')".
Every example in those files is run by the test suite.
Installation
pip install gri-memoize
For development:
git clone https://gitlab.com/geosol-foss/python/gri-memoize.git
cd gri-memoize
uv sync
Quick Start
from gri_memoize import MemoizedClass, memoize
class Geometry(MemoizedClass):
def __init__(self, radius: float):
self._radius = radius
@memoize
def area(self) -> float:
"""Circle area (cached after first call)."""
return 3.14159 * self._radius ** 2
@memoize
def circumference(self) -> float:
"""Circle circumference (cached after first call)."""
return 2 * 3.14159 * self._radius
g = Geometry(5.0)
g.area() # Computed
g.area() # Returned from cache
g.clear_memoized_results() # Invalidate all cached results
g.area() # Recomputed
Why Not functools.lru_cache?
| Feature | lru_cache |
gri-memoize |
|---|---|---|
| Cache scope | Global (per function) | Per instance |
| Garbage collection | Cache holds references, preventing GC | Cache dies with instance |
| Cache invalidation | cache_clear() clears all instances |
clear_memoized_results() per instance |
| IDE support | Often loses docstrings and type hints in class context | Full @wraps preservation |
| Argument hashing | Uses __hash__ on all args |
Same, plus per-method isolation |
Usage
- Inherit from
MemoizedClass - Decorate methods with
@memoize - Call
clear_memoized_results()if the underlying data changes
from gri_memoize import MemoizedClass, memoize
class Sensor(MemoizedClass):
def __init__(self, readings: list[float]):
self._readings = readings
@memoize
def mean(self) -> float:
return sum(self._readings) / len(self._readings)
@memoize
def variance(self) -> float:
m = self.mean()
return sum((x - m) ** 2 for x in self._readings) / len(self._readings)
def update(self, readings: list[float]) -> None:
self._readings = readings
self.clear_memoized_results() # Invalidate stale cache
Methods with arguments are cached per unique argument combination:
class Matrix(MemoizedClass):
@memoize
def power(self, n: int) -> float:
return self._value ** n
m = Matrix()
m.power(2) # Cached for n=2
m.power(3) # Cached separately for n=3
How It Works
Each MemoizedClass instance carries a memoized_results dictionary, initialized in __new__ to support multiple inheritance. The @memoize decorator builds a key from the function's qualified name, positional args, and sorted keyword args; the args must be hashable. On cache hit, the stored result is returned without calling the function.
Dependencies
None. gri-memoize has no external dependencies.
Other Projects
Current list of other GRI FOSS Projects we are building and maintaining.
License
MIT License. See LICENSE for details.
Metadata
Release files for gri-memoize 0.2.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| gri_memoize-0.2.4.tar.gz | 17.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gri_memoize-0.2.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 26.1 kB
Release files / gri_memoize-0.2.4.tar.gz
| Download URL | gri_memoize-0.2.4.tar.gz |
|---|---|
| Size | 17.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ea8303055b6ace4a91cd8bb804407651c8d5d4ce549a22089ead9ada77158839
|
|
BLAKE2b-256 checksum How to use checksums |
cac86cba7cca4de596ceff37a6a66042c2089ebf03871b33b8d92b0beec351d3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / gri_memoize-0.2.4-py3-none-any.whl
| Download URL | gri_memoize-0.2.4-py3-none-any.whl |
|---|---|
| Size | 8.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
332b5307fb0c92e3aac1347e9d0a9e8e337cbe20e889006060d1a21695761bcb
|
|
BLAKE2b-256 checksum How to use checksums |
f7ad0b6dfa4e9a7c8194b33dcd1aa53a2ee239b4424408372665e2ff8e3047f3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|