Manually Cache#

This guide addresses how to cache data and objects globally across user sessions - pn.state.cache.


The panel.state.cache object is a simple dictionary that is shared between all sessions on a particular Panel server process. This makes it possible to load large datasets (or other objects you want to share) once and subsequently access the cached object.

To assign to the cache manually, simply put the data load or expensive calculation in an if/else block which checks whether the custom key is already present:

if 'data' in pn.state.cache:
    data = pn.state.cache['data']
else:
    pn.state.cache['data'] = data = ... # Load some data or perform an expensive computation

Alternatively, the as_cached helper function provides a slightly cleaner way to write the caching logic. Instead of writing a conditional statement you write a function that is executed only when the inputs to the function change. If provided, the args and kwargs will also be hashed making it easy to cache (or memoize) on the arguments to the function:

def load_data(*args, **kwargs):
    return ... # Load some data

data = pn.state.as_cached('data', load_data, *args, **kwargs)

Now, the first time the app is loaded the data will be cached and subsequent sessions will simply look up the data in the cache, speeding up the process of rendering. If you want to warm up the cache before the first user visits the application you can also provide the --warm argument to the panel serve command, which will ensure the application is initialized as soon as it is launched. If you want to populate the cache in a separate script from your main application you may also provide the path to a setup script using the --setup argument to panel serve.