Skip to main content

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

  1. the surrounding class need not be hashable,
  2. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cached_method-0.1.0.tar.gz (4.0 kB view details)

Uploaded Source

Built Distribution

cached_method-0.1.0-py3-none-any.whl (4.2 kB view details)

Uploaded Python 3

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

Hashes for cached_method-0.1.0.tar.gz
Algorithm Hash digest
SHA256 0958d0422a90e24c215fb61f9633fd9faf566c8f7d15478493989abef8699d73
MD5 c6ea38eebb04702e274af42c2908f012
BLAKE2b-256 8557f5796619b29cfbbce98b6027f9f92461a9c159a373566106a11b2bab1e07

See more details on using hashes here.

File details

Details for the file cached_method-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for cached_method-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a71720f7cab565131bb5e4189b6ca5902635435e0e017d0fd1261712d8c3dc0c
MD5 144e648914174b2612aca8e55135f5a0
BLAKE2b-256 a369f4be248608758ebad3d5954bf468fc98a822c939afbb04f1eaaecfc6be1c

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page