Protocol vs ABC: Утиная типизация на стероидах (Static Duck Typing)
В классическом ООП (Java, C#) и при использовании
Это создает жесткую связность (coupling): ваша реализация должна знать об интерфейсе и импортировать его.
С приходом
В чем суть?
Если класс имеет метод
Сравним код:
❌ Старый путь (ABC):
✅ Новый путь (Protocol):
Киллер-фича: Retroactive Abstraction (Ретроактивная абстракция)
Представьте, что вы используете стороннюю библиотеку (например,
С помощью
Нюансы для Middle+:
1. Runtime: По умолчанию
2. Свойства: В протоколе можно описывать не только методы, но и поля через
Используйте Протоколы, чтобы развязать зависимости между модулями. Это основа принципа Dependency Inversion в Python.
#python #typing #mypy #architecture #clean_code
📲 Мы в MAX
👉@BookPython
В классическом ООП (Java, C#) и при использовании
abc.ABC в Python мы привыкли к Nominal Subtyping (Именная подтипизация). Чтобы объект считался Bird, он должен явно наследоваться от Bird.Это создает жесткую связность (coupling): ваша реализация должна знать об интерфейсе и импортировать его.
С приходом
typing.Protocol (Python 3.8+) мы получили Structural Subtyping (Структурная подтипизация).В чем суть?
Если класс имеет метод
quack(), то это Утка. Неважно, от чего он наследуется. Это и есть та самая «утиная типизация», но теперь поддерживаемая статическим анализатором (mypy, pyright, IDE).Сравним код:
❌ Старый путь (ABC):
from abc import ABC, abstractmethod
# 1. Жестко определяем интерфейс
class SenderABC(ABC):
@abstractmethod
def send(self, msg: str) -> None: pass
# 2. Обязаны наследоваться!
class EmailService(SenderABC):
def send(self, msg: str) -> None:
print(f"Email: {msg}")
def alert(sender: SenderABC):
sender.send("Alert!")
✅ Новый путь (Protocol):
from typing import Protocol
# 1. Описываем, "что мы ждем от объекта"
class SenderProto(Protocol):
def send(self, msg: str) -> None: ...
# 2. Реализация НИЧЕГО не знает про Protocol
# Никаких импортов и наследования!
class SmsService:
def send(self, msg: str) -> None:
print(f"SMS: {msg}")
# Mypy счастлив: SmsService имеет нужную структуру (метод send)
def alert(sender: SenderProto):
sender.send("Alert!")
alert(SmsService())
Киллер-фича: Retroactive Abstraction (Ретроактивная абстракция)
Представьте, что вы используете стороннюю библиотеку (например,
boto3 или клиент Redis). Вы не можете заставить их классы наследоваться от ваших ABC.С помощью
Protocol вы можете создать интерфейс для уже существующего чужого кода, не меняя его, и типизировать свои функции.Нюансы для Middle+:
1. Runtime: По умолчанию
isinstance(obj, MyProtocol) выбросит ошибку. Протоколы - это compile-time фича. Если нужна проверка в рантайме, декорируйте протокол @runtime_checkable.2. Свойства: В протоколе можно описывать не только методы, но и поля через
@property или просто аннотации типов.Используйте Протоколы, чтобы развязать зависимости между модулями. Это основа принципа Dependency Inversion в Python.
#python #typing #mypy #architecture #clean_code
📲 Мы в MAX
👉@BookPython
👍5🔥1
Если у вас есть ресурсоемкая задача для процессора и вы хотите использовать все доступные ядра, то
Также можно не указывать параметр
📲 Мы в MAX
👉@BookPython
multiprocessing.Pool - это то, что вам нужно. Он создает несколько процессов и автоматически распределяет между ними задачи. Просто создайте пул с Pool(number_of_processes) и выполните p.map с списком входных данных.
import math
from multiprocessing import Pool
inputs = [i ** 2 for i in range(100, 130)]
def f(x):
return len(str(math.factorial(x)))
# Однопоточное выполнение
%timeit [f(x) for x in inputs]
# 1.44 s ± 19.2 ms per loop (...)
# Параллельное выполнение с 4 процессами
p = Pool(4)
%timeit p.map(f, inputs)
# 451 ms ± 34 ms per loop (...)
Также можно не указывать параметр
number_of_processes, по умолчанию он равен количеству ядер CPU в системе.📲 Мы в MAX
👉@BookPython
❤1👍1
10 полезных библиотек для Python-разработчика
Сегодня я подготовил для вас подборку из 10 полезных библиотек, которые могут сделать вашу разработку проще и эффективнее. Поехали! 🚀
1️⃣ Rich – красивый вывод в консоль. Если хотите раскрасить логи, добавить таблицы или анимации – эта библиотека вам пригодится.
📌
2️⃣ Typer – современный способ писать CLI-приложения. Работает на основе аннотаций типов и делает разработку CLI удобнее.
📌
3️⃣ Pendulum – альтернатива
📌
4️⃣ HTTPX – асинхронный клиент для работы с HTTP-запросами. Поддерживает
📌
5️⃣ Pydantic – мощный инструмент для валидации данных и работы с моделями. Особенно полезен в FastAPI.
📌
6️⃣ Poetry – современный менеджер зависимостей. Упрощает работу с виртуальными окружениями и пакетами.
📌
7️⃣ Loguru – удобная альтернатива стандартному
📌
8️⃣ FastAPI – один из самых быстрых Python-фреймворков для создания API. Использует аннотации типов и
📌
9️⃣ Tqdm – библиотека для удобных progress-bar'ов в терминале. Незаменима при обработке больших данных.
📌
🔟 Black – автоматический форматтер кода, который придерживается строгого стиля. Просто устанавливаешь – и больше не думаешь о стиле кода.
📌
📲 Мы в MAX
👉@BookPython
Сегодня я подготовил для вас подборку из 10 полезных библиотек, которые могут сделать вашу разработку проще и эффективнее. Поехали! 🚀
1️⃣ Rich – красивый вывод в консоль. Если хотите раскрасить логи, добавить таблицы или анимации – эта библиотека вам пригодится.
📌
pip install rich2️⃣ Typer – современный способ писать CLI-приложения. Работает на основе аннотаций типов и делает разработку CLI удобнее.
📌
pip install typer3️⃣ Pendulum – альтернатива
datetime, но с удобным API и встроенной поддержкой часовых поясов. 📌
pip install pendulum4️⃣ HTTPX – асинхронный клиент для работы с HTTP-запросами. Поддерживает
async/await, в отличие от requests. 📌
pip install httpx5️⃣ Pydantic – мощный инструмент для валидации данных и работы с моделями. Особенно полезен в FastAPI.
📌
pip install pydantic6️⃣ Poetry – современный менеджер зависимостей. Упрощает работу с виртуальными окружениями и пакетами.
📌
pip install poetry7️⃣ Loguru – удобная альтернатива стандартному
logging. Позволяет логировать без лишнего кода. 📌
pip install loguru8️⃣ FastAPI – один из самых быстрых Python-фреймворков для создания API. Использует аннотации типов и
async/await. 📌
pip install fastapi9️⃣ Tqdm – библиотека для удобных progress-bar'ов в терминале. Незаменима при обработке больших данных.
📌
pip install tqdm🔟 Black – автоматический форматтер кода, который придерживается строгого стиля. Просто устанавливаешь – и больше не думаешь о стиле кода.
📌
pip install black📲 Мы в MAX
👉@BookPython
👍2❤1🔥1
🔥 Как ускорить Python-код в 10 раз?
Сегодня покажу вам мощный инструмент для оптимизации кода - Numba. Это библиотека, которая позволяет компилировать Python-функции в машинный код, используя JIT-компилятор.
🚀 Как это работает?
Numba использует LLVM для компиляции кода во время выполнения, превращая Python в код, близкий по скорости к C.
Пример
Допустим, у нас есть функция, вычисляющая сумму квадратов чисел:
Теперь ускорим её с помощью Numba:
📊 Результат:
✅ Код на чистом Python выполняется ~5-10 раз медленнее, чем с Numba.
✅ Numba особенно полезна для математических вычислений и обработки массивов.
✅ Простая аннотация @jit(nopython=True) уже даёт мощный прирост скорости!
Где применять?
✔ Численные расчёты
✔ Обработку данных
✔ Алгоритмы машинного обучения
Попробуйте Numba и напишите в комментариях, удалось ли вам ускорить свой код!
📲 Мы в MAX
👉@BookPython
Сегодня покажу вам мощный инструмент для оптимизации кода - Numba. Это библиотека, которая позволяет компилировать Python-функции в машинный код, используя JIT-компилятор.
🚀 Как это работает?
Numba использует LLVM для компиляции кода во время выполнения, превращая Python в код, близкий по скорости к C.
Пример
Допустим, у нас есть функция, вычисляющая сумму квадратов чисел:
import numpy as np
import time
def sum_of_squares(n):
result = 0
for i in range(n):
result += i ** 2
return result
n = 10**7
start = time.time()
sum_of_squares(n)
print("Обычный Python:", time.time() - start)
Теперь ускорим её с помощью Numba:
from numba import jit
@jit(nopython=True)
def sum_of_squares_numba(n):
result = 0
for i in range(n):
result += i ** 2
return result
start = time.time()
sum_of_squares_numba(n)
print("С Numba:", time.time() - start)
📊 Результат:
✅ Код на чистом Python выполняется ~5-10 раз медленнее, чем с Numba.
✅ Numba особенно полезна для математических вычислений и обработки массивов.
✅ Простая аннотация @jit(nopython=True) уже даёт мощный прирост скорости!
Где применять?
✔ Численные расчёты
✔ Обработку данных
✔ Алгоритмы машинного обучения
Попробуйте Numba и напишите в комментариях, удалось ли вам ускорить свой код!
📲 Мы в MAX
👉@BookPython