Простой способ кэширования результатов работы с 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)