Как повысить эффективность кода Python с помощью кэширования

Как Python-разработчику, вам наверняка хочется сделать код быстрее, эффективнее и идеальнее во всех отношениях. Я познакомлю вас с волшебным трюком под названием “кэширование”.

Что такое кэширование?

Кэширование  —  это что-то вроде секретного хранилища для часто используемых в коде элементов. Вместо того чтобы многократно выполнять одни и те же действия, вы сохраняете результат в удобном месте. Затем, когда он снова понадобится вам (или кому-либо еще), вы просто достаете его из секретного тайника. Это все равно что иметь любимую закуску всегда под рукой.

Зачем нужно кэширование?

Кэширование  —  это больше, чем просто изящный трюк. Вот почему оно важно.

1. Ускорение работы. Кэширование повышает скорость написания кода. Вместо того чтобы заставлять компьютер выполнять одну и ту же сложную работу снова и снова, вы сохраняете результат. Когда он снова понадобится, то будет готов, как кратчайший путь к совершенству.

2. Экономия ресурсов. Ваш компьютер очень ценен, и кэширование бережно относится к нему. Оно экономит мощность процессора и память, поскольку вы не повторяете ненужные действия. Это как выключить свет, когда вы выходите из комнаты,  —  экологически чистые вычисления!

3. Масштабирование. Представьте, что ваше приложение становится популярным, и множество людей хотят им воспользоваться. Кэширование будет выдавать результаты без особых проблем. Это спасет ваши серверы от перехода в режим паники.

4. Минимизация денежных расходов. Если вы работаете в облаке, то меньшее количество запросов к внешним службам означает меньшие расходы. Кэширование может вызвать улыбку на лице вашего бухгалтера.

Как кэшировать на профессиональном уровне?

Python предлагает несколько способов работы с кэшем.

1. Простое кэширование на основе словаря. Это подход типа “сделай сам”. Вы создаете словарь для хранения результатов кэширования. Когда вам что-то нужно, проверяете, есть ли это в словаре. Если есть —  отлично, используйте. Если нет, сохраните результат для следующего раза.

# Инициализация пустого словаря кэша
cache = {}
# Функция для вычисления квадратов чисел с кэшированием
def calculate_square(x):
if x in cache:
return cache[x]
else:
result = x ** 2
cache[x] = result
return result
# Тестирование функции
print(calculate_square(5)) # Вычисляет и кэширует 5*5 = 25
print(calculate_square(5)) # Вместо пересчета результат (25) извлекается из кэша

2. Использование functools.lru_cache. Python готов поддержать вас с помощью декоратора lru_cache из модуля functools. Как личному помощнику, вы можете доверить ему выполнение своих обязанностей. Он запоминает несколько последних действий, которые выполняла ваша функция, и выдает их, когда это необходимо.

from functools import lru_cache
# Функция для вычисления чисел Фибоначчи
@lru_cache(maxsize=None) # None означает, что кэш может расти без ограничений
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
# Тестирование функции
print(fibonacci(10)) # Вычисляет и кэширует Fibonacci(10)
print(fibonacci(10)) # Вместо пересчета результат извлекается из кэша

3. Использование внешнего кэширования (Redis). Для больших задач можно использовать внешние системы кэширования, такие как Redis и Memcached. Они подобны кэширующему суперкомпьютеру  —  быстрые, масштабируемые и многофункциональные.

import redis
import psycopg2
# Инициализация подключения к Redis
redis_conn = redis.StrictRedis(host='localhost', port=6379, db=0)
# Функция получения пользовательских данных из базы данных с кэшированием
def fetch_user_data(user_id):
# Проверка наличия данных в кэше
cached_data = redis_conn.get(f'user:{user_id}')
if cached_data:
return cached_data.decode('utf-8')
else:
# Если данных нет в кэше, они извлекаются из базы данных
conn = psycopg2.connect(database='mydb', user='myuser', password='mypassword', host='localhost', port='5432')
cursor = conn.cursor()
cursor.execute(f'SELECT * FROM users WHERE id = {user_id}')
user_data = cursor.fetchone()
conn.close()
# Кэширование полученных данных в Redis
redis_conn.set(f'user:{user_id}', user_data, ex=3600) # Cache for 1 hour
return user_data
# Тестирование функции
print(fetch_user_data(1)) # Получение и кэширование пользовательских данных с идентификатором 1
print(fetch_user_data(1)) # Получение результата из кэша вместо обращения к данным

Приведенные примеры демонстрируют способы реализации кэширования в Python с использованием базовых словарей, lru_cache и внешних систем кэширования, таких как Redis. В зависимости от конкретной ситуации, вы можете выбрать ту стратегию кэширования, которая наилучшим образом соответствует вашим потребностям.

Заключение

Кэширование  —  это не просто технический прием, а ваше секретное оружие, способное сделать код Python молниеносно быстрым и ресурсоэффективным. Создаете ли вы очередное крупное веб-приложение, занимаетесь ли профессиональной обработкой данных или просто экспериментируете с Python, кэширование  —  ваш верный помощник.

Возьмите на заметку этот трюк под названием “кэширование”, и ваши Python-путешествия окажутся еще более увлекательными. Скорость, эффективность и масштабируемость вам обеспечены.

Читайте также:

Читайте нас в Telegram, VK и Дзен

Перевод статьи Sai Santosh Pal: Supercharge Your Python Code with Caching

Сообщение Как повысить эффективность кода Python с помощью кэширования появились сначала на NOP::Nuances of programming.

Похожие записи

AEGIS Algorithms Android Angular API API Canvas AppSec Architecture Artificial Intelligence Astro Authentication AutoGPT AWS AWS Aurora AWS Boto3 AWS EC2 AWS Lambda Azure Backend bash Beautiful Soup Big Data Binary Tree Browser API Bun Charts ChatGPT Chrome Extension Clean Code CLI ClickHouse Coding Combine Compose Computer Context Fusion Cosmo Route CProgramming cron Cryptography CSS CTF Data science dbt dbt Cloud deno Design Detekt Development Distributed Systems Django Docker Docker Hub Drizzle DRY DuckDB FastAPI Flask Flutter For Beginners Front End Development Game Development GCN Geospatial GitHub Actions GitHub Pages Gitlab GMS Golang Google Google Sheets Google Wire GPT-3 GPT3 Gradio Gradle Grafana GraphQL gRPC Guidance HMS HTML Huawei HuggingFace InfoSec Interview iOS Jackknife Java JavaScript Jetpack Compose JSON Kafka Kotlin Kubernetes LangChain Laravel Linux LlaMA LLM Logging Machine Learning Magento Math Mermaid Micro Frontends Mobile mondayDB MongoDB Naming NestJS NET NetMock Networks NextJS NLP Node.js Nodejs OOP OpenAI Pandas PDF PHP Playwright Plotly Polars PostgreSQL Prefect Productivity Programming Prometheus Puppeteer Pushover Python Pytorch Rabbitmq Ramda Raspberry Pi React React Native Reactor Redis REST API Revolut RProgramming Ruby Rust Scalene ScyllaDB Selenium Sklearn SLO SnowFlake Snowkase Software Architecture Software Development Solara Solid Spring Boot SQL SQLite Streamlit SudoLang Supabase Swift SwiftUI Tailwind CSS Terraform Testing Transformers TypeScript Ubuntu UI Design Unix UX Vim VSCode Vue Web Components Web Development Web Frameworks Web Scraping Web-разработка Webassembly Websocket Whisper Widgets WordPress YAML YouTube Наука о данных Разное Тренды

Сложные вопросы на собеседовании для тех, кто 7 лет работал с Java. Часть 1

Вы пропустили

AEGIS Algorithms Android Angular API API Canvas AppSec Architecture Artificial Intelligence Astro Authentication AutoGPT AWS AWS Aurora AWS Boto3 AWS EC2 AWS Lambda Azure Backend bash Beautiful Soup Big Data Binary Tree Browser API Bun Charts ChatGPT Chrome Extension Clean Code CLI ClickHouse Coding Combine Compose Computer Context Fusion Cosmo Route CProgramming cron Cryptography CSS CTF Data science dbt dbt Cloud deno Design Detekt Development Distributed Systems Django Docker Docker Hub Drizzle DRY DuckDB FastAPI Flask Flutter For Beginners Front End Development Game Development GCN Geospatial GitHub Actions GitHub Pages Gitlab GMS Golang Google Google Sheets Google Wire GPT-3 GPT3 Gradio Gradle Grafana GraphQL gRPC Guidance HMS HTML Huawei HuggingFace InfoSec Interview iOS Jackknife Java JavaScript Jetpack Compose JSON Kafka Kotlin Kubernetes LangChain Laravel Linux LlaMA LLM Logging Machine Learning Magento Math Mermaid Micro Frontends Mobile mondayDB MongoDB Naming NestJS NET NetMock Networks NextJS NLP Node.js Nodejs OOP OpenAI Pandas PDF PHP Playwright Plotly Polars PostgreSQL Prefect Productivity Programming Prometheus Puppeteer Pushover Python Pytorch Rabbitmq Ramda Raspberry Pi React React Native Reactor Redis REST API Revolut RProgramming Ruby Rust Scalene ScyllaDB Selenium Sklearn SLO SnowFlake Snowkase Software Architecture Software Development Solara Solid Spring Boot SQL SQLite Streamlit SudoLang Supabase Swift SwiftUI Tailwind CSS Terraform Testing Transformers TypeScript Ubuntu UI Design Unix UX Vim VSCode Vue Web Components Web Development Web Frameworks Web Scraping Web-разработка Webassembly Websocket Whisper Widgets WordPress YAML YouTube Наука о данных Разное Тренды

Сложные вопросы на собеседовании для тех, кто 7 лет работал с Java. Часть 1