Persistent caching for Python functions
Project description
marinate
marinate caches function calls to your disk. This lets you memoize operations across runs of your code. So even if your program terminates, you can run it again without re-invoking slow or expensive functions.
from marinate import marinate
@marinate
def my_slow_fn(input):
# Function that's slow or expensive
In-memory (transient) caching is also supported.
Features:
- Uses pickle to store function outputs locally
- Supports functions with mutable or un-hashable arguments (e.g. dicts, lists, numpy arrays)
- Thread-safe
- Supports asynchronous functions
- Control the cache lifetime and location
Installation
> pip install marinate
Usage
To marinate a function just add the @marinate decorator to it:
from marinate import marinate
@marinate
def my_fn():
# Does something
If you later modify the function, you can invalidate its cache using the overwrite parameter:
@marinate(overwrite=True)
def my_fn():
# Does something different
This will force a function call and overwrite whatever's in the cache.
Cache location
By default, cached function calls are stored in the same directory as the files they're defined in. You'll find them in a folder called .marinade.
However, you can change where a function call is stored by setting the cache_dir parameter in the decorator:
@marinate(cache_dir="~/pickle_jar")
def my_fn():
# ...
After running your program, you'll see pickle (.pkl) files appear in the directory you specified.
You can also specify a cache directory for all marinated functions:
from marinate import set_cache_dir
set_cache_dir("~/pickle_jar")
@marinate
def my_fn():
# Output will be stored in ~/pickle_jar
Disk vs. RAM
You can also use marinate to cache functions in-memory rather than on-disk. This is preferred if you only care about memoizing operations within a single run of a program, rather than across runs.
@marinate(store="memory")
def my_fn():
# Do things
In other words, @marinate is a drop-in replacement for Python's built-in @cache decorator.
Limitations
Only certain functions can and should be marinated:
- Functions that return an unpickleable object, e.g. sockets or database connections, cannot be cached.
- Functions must be pure and deterministic. Meaning they should produce the same output given the same input, and should not have side-effects.
- Function arguments must be hashable.
- Don't marinate functions that take less than a second. The disk I/O overhead will negate the benefits of caching.
- Not all methods in classes should be cached.
- Also ignore self when generating cache key
- Make a global enable_cache and disable_cache function
- .disable and .enable methods on functions
- .picklejar instead of .marinade
- Be careful with mutable inputs.
- Be careful with side-effects.
Authors
Created by Paul Bogdan and Jonathan Shobrook to make our lives easier when iterating on data/training pipelines.
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
File details
Details for the file pkld-1.0.1.tar.gz.
File metadata
- Download URL: pkld-1.0.1.tar.gz
- Upload date:
- Size: 6.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.0 CPython/3.9.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
07f094056f1412b29817f613dc82cf11f02e19841924ab48bff42d488488d121
|
|
| MD5 |
47eefbc3a5481b3b60711cd117b1dbe2
|
|
| BLAKE2b-256 |
ea62f463bcdd8337988985949ba90ae96d7d3be3509f5bf23561c1f9828ad93a
|