python
March 30, 2023

Простой способ кэширования результатов работы с Python

Память — это медная доска, покрытая буквами, которые время незаметно сглаживает, если порой не возобновлять их резцом (Джон Локк). Рассмотрим простой способ кэширования результатов работы функций, чтобы не выполнять большие вычисления повторно или работать офлайн с однократно загруженными данными. Для примера рассмотрим ресурсоемкую функцию:

import numpy as np
import pandas as pd
np.random.seed(0)

def calc_corr():
    ar = np.random.randint(-100,100, size=10000000)
    return pd.DataFrame({'val1':ar, 'val2':ar**2}).corr()
     
%time calc_corr()

Для кэширования результатов ее работы воспользуемся библиотекой joblib и создадим объект класса joblib.Memory с указанием пути к кэшируемой директории. Затем декорируем нашу функцию, передав в качестве аргумента в метод cache:

import joblib

memory = joblib.Memory('data/cache')
calc_corr_cache = memory.cache(calc_corr)

%time calc_corr_cache()

Однократное выполнение calc_corr вместе с созданием кэша выдает сравнимое время с самым первым запуском, а вот повторный запуск происходит в разы быстрее:

%time calc_corr_cache()

Такой способ кэширования удобен и для работы с данными офлайн:

from sklearn.datasets import fetch_openml

fetch_openml_cache = memory.cache(fetch_openml)

fetch_openml_cache('tic-tac-toe', return_X_y=True, as_frame=True)

Повторные запуски fetch_openml_cache не потребуют обращения к Интернету.

Для очистки директории от кэшированных файлов вызовите метод clear:

memory.clear(warn=False)