The equivalent of cached_property for methods
Project description
cached_method
The @cached_method
decorator is the equivalent of
functools.cached_property
for methods. This means that each instance has its own cache, so that the caches get
garbage collected as soon as the owning objects are. The main advantages of
cached_method
over applying functools.lru_cache
directly to methods are
- the surrounding class need not be hashable,
- and the class objects are not collected in a global cache, extending their lifetime.
This makes
cached_method
applicable to classes holding references to scarce resources such as GPU memory that you want to be freed as soon as possible. Furthermore, the decorator can cache the output of__hash__
because it does not hash the object itself for cache lookups.
Implementation-wise cached_method
closely follows functools.cached_property
though it
eschews the internal locking, which is now considered a
mistake. Since cached methods should be idempotent
anyway, we just accept possibly calling the method multiple times in parallel with
equivalent arguments if the object is used in multi-threaded contexts.
from cached_method import cached_method
class GPUVector:
def __init__(self, data):
# data is some smart tensor object as found in pytorch, tensorflow, etc.
self.data = data
# Only cache the 2 most-recently used norms
@cached_method(maxsize=2)
def norm(self, p=2):
return (self.data ** p).sum() ** (1 / p)
@cached_method
def __hash__(self):
# A costly GPU-to-CPU transfer, so we want to hash the result
return hash(tuple(self.data.to_cpu()))
If you are working with small, hashable objects that do not have to be gargabe collected as soon as possible, consider the method hashing technique described in the Python FAQ. It gives you an easy way to control the total cache size and allows cache hits between equivalent-but-not-identical objects. Of course, caching on the class level means that objects stay live until you clear the cache manually, even if the cache is the last object referencing them.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file cached_method-0.1.0.tar.gz
.
File metadata
- Download URL: cached_method-0.1.0.tar.gz
- Upload date:
- Size: 4.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.26.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0958d0422a90e24c215fb61f9633fd9faf566c8f7d15478493989abef8699d73 |
|
MD5 | c6ea38eebb04702e274af42c2908f012 |
|
BLAKE2b-256 | 8557f5796619b29cfbbce98b6027f9f92461a9c159a373566106a11b2bab1e07 |
File details
Details for the file cached_method-0.1.0-py3-none-any.whl
.
File metadata
- Download URL: cached_method-0.1.0-py3-none-any.whl
- Upload date:
- Size: 4.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.26.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a71720f7cab565131bb5e4189b6ca5902635435e0e017d0fd1261712d8c3dc0c |
|
MD5 | 144e648914174b2612aca8e55135f5a0 |
|
BLAKE2b-256 | a369f4be248608758ebad3d5954bf468fc98a822c939afbb04f1eaaecfc6be1c |