Clean Architecture в Python: не догма, а инструмент — разбор от разработчика с 30-летним стажем
Макс Кирхофф взял интервью у Сэма Кина — автора книги «Clean Architecture with Python». Сэм прошёл путь от стартапов до AWS и делится практическим подходом к архитектуре.
Ключевые моменты
🔘 Clean Architecture — не «всё или ничего», а набор принципов под твой контекст
🔘 Главная ценность — грамотное управление зависимостями и чёткая доменная модель
🔘 Хорошая архитектура = тестируемый код (связь прямая)
🔘 Бонус: чистая архитектура упрощает работу с AI-ассистентами при написании кода
Почему важно
Python любят за прагматику — и можно сохранить её, не скатываясь в спагетти-код. Архитектурные принципы адаптируются, а не навязываются.
📎 Видео на YouTube или в этом посте
@zen_of_python
Макс Кирхофф взял интервью у Сэма Кина — автора книги «Clean Architecture with Python». Сэм прошёл путь от стартапов до AWS и делится практическим подходом к архитектуре.
Ключевые моменты
Почему важно
Python любят за прагматику — и можно сохранить её, не скатываясь в спагетти-код. Архитектурные принципы адаптируются, а не навязываются.
@zen_of_python
Media is too big
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Весь год вы носили футболки и джинсы… Хватит!
Заглядывайте к нам в виртуальную примерочную и выбирайте себе идеальный скин для встречи Нового года.
Осторожно, эти наряды могут наповал сразить ваших коллег…
Реклама
Заглядывайте к нам в виртуальную примерочную и выбирайте себе идеальный скин для встречи Нового года.
Осторожно, эти наряды могут наповал сразить ваших коллег…
Реклама
👍5🤣3❤1
Tryolabs опубликовали 11-й ежегодный топ Python-библиотек
Команда перелопатила сотни проектов и отобрала те, что реально полезны в продакшене. Критерии: практическая польза (не хайп), активная поддержка, понятная ценность для разработчика. AI-библиотек могло быть 90%, но список специально разделили на две части.
➡️ Категория «Не ИИ»
0️⃣ ty — тайпчекер на Rust от Astral (авторы ruff и uv). Инкрементальный анализ на уровне функций — меняешь одну функцию, перепроверяется только она
1️⃣ complexipy — измеряет когнитивную сложность кода (не цикломатическую). Есть GitHub Action, pre-commit хук и расширение для VS Code
3️⃣ Kreuzberg — извлекает данные из 50+ форматов, работает на Rust, биндинги для Python/TS/Ruby/Go. Есть CLI, REST API и MCP-сервер
3️⃣ throttled-py — rate limiting с пятью алгоритмами (Fixed Window, Token Bucket, GCRA и др.), поддержка Redis и async
4️⃣ httptap — waterfall-визуализация HTTP-запросов: DNS, TLS handshake, время ответа — всё по фазам
5️⃣ fastapi-guard — security-мидлварь для FastAPI: IP-фильтры, геоблокировка, детект SQL-инъекций
6️⃣ modshim — оверлей модификаций поверх чужих модулей без monkey-patching и форков
7️⃣ Spec Kit — спецификации как источник истины для AI-ассистентов. Пишешь spec → AI генерит код по плану, а не угадывает (и всё же что-то про ИИ — прим. ред.)
8️⃣ skylos — поиск мёртвого кода + детект уязвимостей, включая паттерны vibe-coded кода
9️⃣ FastOpenAPI — автогенерация OpenAPI-документации для Flask, Falcon, Tornado, Django и ещё 4 фреймворков
➡️ Категория «AI/ML/Data»
0️⃣ MCP Python SDK + FastMCP — стандарт подключения LLM к внешним данным (Anthropic)
1️⃣ TOON — Token-Oriented Object Notation, JSON-like, но YAML-стиль для вложенности + CSV-формат для массивов. Экономия 40-60% токенов, заголовки с длиной помогают LLM валидировать структуру
3️⃣ Deep Agents — агентный фреймворк с planning через write_todos/read_todos, файловой системой (ls, read_file, edit_file), спавном субагентов
3️⃣ smolagents — агенты в ~1000 строк кода. LLM пишет действия как Python, а не JSON → на 30% меньше шагов на бенчмарках. Поддержка любых LLM, E2B/Docker/WASM sandbox
4️⃣ LlamaIndex Workflows — event-driven архитектура: степы + события вместо DAG. Async-first, автовывод типов из аннотаций, стриминг результатов, чекпоинты для возобновления
5️⃣ Batchata — единый интерфейс для batch API Anthropic/OpenAI/Gemini. Экономия 50%, лимиты по стоимости, dry-run для оценки расходов, Pydantic-валидация выходов
6️⃣ MarkItDown — PDF/DOCX/PPTX/Excel/HTML/аудио → Markdown. Сохраняет структуру (заголовки, таблицы, списки)
7️⃣ Data Formulator — визуализация через natural language + drag-n-drop. Указываешь поля которых ещё нет («profit_margin») → AI генерит трансформацию
8️⃣ LangExtract — извлечение структурированных данных с точной привязкой к позиции в тексте (character offset). Критично для медицины/юридики. Few-shot, чанкинг для длинных документов, HTML-визуализация
9️⃣ GeoAI — мост между PyTorch/Transformers и геоданными. Поиск спутниковых снимков → подготовка датасета → обучение → инференс → визуализация через Leafmap
@zen_of_python
Команда перелопатила сотни проектов и отобрала те, что реально полезны в продакшене. Критерии: практическая польза (не хайп), активная поддержка, понятная ценность для разработчика. AI-библиотек могло быть 90%, но список специально разделили на две части.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍12❤6✍2
pyreqwest — новый HTTP-клиент на Rust для Python. GIL-free, HTTP/2 из коробки, sync и async с одинаковым API. Автор — тот же разработчик, который открыл issue #3215 в httpx о 10x просадке производительности при конкурентных запросах.
Зачем переходить с httpx
httpx/httpcore имеют давние проблемы с connection pooling — при 20 конкурентных запросах httpx в 10+ раз медленнее aiohttp. Эти баги висят годами. pyreqwest решает их на уровне архитектуры, потому что connection pool реализован на Rust.
➡️ Если httpx работает — можно не трогать. Но в высоконагруженных системах он станет бутылочным горлышком.
Фичи
🔘 HTTP/1.1 и HTTP/2 (у aiohttp нет HTTP/2)
🔘 Автодекомпрессия: zstd, gzip, brotli, deflate
🔘 TLS через rustls
🔘 Connection pooling, стриминг, multipart
🔘 Куки, прокси, редиректы, таймауты
🔘 Полные type hints, zero Python-зависимостей
🔘 Встроенный мок для тестов + подключение к ASGI напрямую
Быстрый старт:
📎 Код на GitHub
@zen_of_python
Зачем переходить с httpx
httpx/httpcore имеют давние проблемы с connection pooling — при 20 конкурентных запросах httpx в 10+ раз медленнее aiohttp. Эти баги висят годами. pyreqwest решает их на уровне архитектуры, потому что connection pool реализован на Rust.
Фичи
Быстрый старт:
# uv add pyreqwest
from pyreqwest.client import ClientBuilder, SyncClientBuilder
async def example_async():
async with ClientBuilder().error_for_status(True).build() as client:
response = await client.get("https://httpbun.com/get").query({"q": "val"}).build().send()
print(await response.json())
def example_sync():
with SyncClientBuilder().error_for_status(True).build() as client:
print(client.get("https://httpbun.com/get").query({"q": "val"}).build().send().json())
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤1
Вышел Gazetteer — офлайн геокодер на Python, который не врёт на границах
Небольшое напоминание, зачем это вообще нужно:
➡️ Reverse geocoding — когда есть координаты, а нужно понять что там: страна, регион, город. Нужно для аналитики доставки, логистики, геотаргетинга, обработки GPS-логов. Проблема: большинство офлайн-решений ищут ближайшую точку (nearest-neighbor). У границ это ломается — ближайший город может быть в другой стране.
Gazetteer проверяет, в какой полигон реально попадает координата. KD-Tree для быстрого отсева + валидация вхождения в polygon.
Характеристики
🔘 210+ стран, 145 000+ административных границ
🔘 10 000 координат за <2 секунды (<0,4 мс на точку)
🔘 Single-process и multiprocessing
🔘 Без внешних API — никаких лимитов и платежей
🔘 Автор говорит, что начинал как toy project, но оказалось production-ready.
📎 Код на GitHub, документация на сайте
@zen_of_python
Небольшое напоминание, зачем это вообще нужно:
Gazetteer проверяет, в какой полигон реально попадает координата. KD-Tree для быстрого отсева + валидация вхождения в polygon.
Характеристики
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
Servy — свежий проект для запуска Python-скриптов (на самом деле не только Python) как Windows-сервисов без боли
Проблема: нужно, чтобы Python-скрипт работал в фоне как сервис Windows: стартовал при загрузке, перезапускался при падении, писал логи. Стандартный sc работает только с приложениями, специально написанными как сервисы, а pythonw.exe + Task Scheduler — костыль без нормального мониторинга.
Решение: Servy. Указываешь путь к Python, скрипт, аргументы, рабочую директорию, env-переменные → Install → готово. Есть GUI для тех, кто не любит CLI.
Что умеет
🔘 Логирование stdout/stderr с ротацией (по размеру и дате)
🔘 Health checks + автоперезапуск при падении
🔘 Мониторинг CPU/RAM в реальном времени
🔘 Уведомления о падениях
🔘 Pre/post-launch хуки
🔘 Экспорт/импорт конфигов
Установка
📎 Код на GitHub, пример для Python, на видео демо
@zen_of_python
Проблема: нужно, чтобы Python-скрипт работал в фоне как сервис Windows: стартовал при загрузке, перезапускался при падении, писал логи. Стандартный sc работает только с приложениями, специально написанными как сервисы, а pythonw.exe + Task Scheduler — костыль без нормального мониторинга.
Решение: Servy. Указываешь путь к Python, скрипт, аргументы, рабочую директорию, env-переменные → Install → готово. Есть GUI для тех, кто не любит CLI.
Что умеет
Установка
winget install servy
choco install -y servy
scoop install servy
@zen_of_python
Media is too big
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
Выпущен Mesa 3.4.0 — фреймворк для агентного моделирования на Python
➡️ Что такое агентное моделирование
Вместо описания системы уравнениями — задаёте простые правила для отдельных «агентов» (птицы, машины, люди) и смотрите, как из их взаимодействий возникают паттерны. Как формируются пробки? Как распространяются эпидемии? Как стаи птиц самоорганизуются? ABM (agent-based model) отвечает на такие вопросы.
➡️ Что такое Mesa
Основной Python-фреймворк для ABM. Интегрирован с NumPy, pandas, Matplotlib. Даёт инструменты для пространственных отношений, планирования агентов, сбора данных. Используется для моделирования эпидемий, рыночной динамики, экологических систем.
➡️ Что нового в 3.4.0
🔘 Единое время симуляции. Раньше время было разбросано: model.steps в простых моделях, simulator.time в discrete event. Теперь единый model.time для всех.
🔘 Воспроизводимость batch run. Новый параметр rng для явного контроля random seeds. Раньше при фиксированном seed все итерации давали одинаковые результаты вместо независимых реплик.
Прочее:
🔘 Визуализация: поддержка AgentPortrayalStyle в Altair
🔘 Удалён экспериментальный cell space → стабильный mesa.discrete_space
🔘 Python 3.12+ обязателен
🔘 Миграция на новую GitHub-организацию mesa
📎 Код на GitHub, подробнее в заметках по релизу, есть онлайн-демо
На скриншоте — классический пример Wolf Sheep: волки (красные) охотятся на овец (голубые), овцы едят траву (зелёные клетки). Справа — график динамики популяций: видно, как система приходит к равновесию.
@zen_of_python
Вместо описания системы уравнениями — задаёте простые правила для отдельных «агентов» (птицы, машины, люди) и смотрите, как из их взаимодействий возникают паттерны. Как формируются пробки? Как распространяются эпидемии? Как стаи птиц самоорганизуются? ABM (agent-based model) отвечает на такие вопросы.
Основной Python-фреймворк для ABM. Интегрирован с NumPy, pandas, Matplotlib. Даёт инструменты для пространственных отношений, планирования агентов, сбора данных. Используется для моделирования эпидемий, рыночной динамики, экологических систем.
Прочее:
На скриншоте — классический пример Wolf Sheep: волки (красные) охотятся на овец (голубые), овцы едят траву (зелёные клетки). Справа — график динамики популяций: видно, как система приходит к равновесию.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2
Media is too big
VIEW IN TELEGRAM
Почему Python наконец-то убирает GIL
GIL — Global Interpreter Lock — один глобальный мьютекс на весь интерпретатор CPython. Любой поток, который хочет выполнить Python-код, должен сначала захватить этот lock. Один lock = только один поток работает в любой момент времени.
➡️ Почему так сделали
В 1991 году, когда появился Python, многоядерных CPU практически не было. Потоки добавили в язык в середине 90-х, и вместо того чтобы защищать каждую внутреннюю структуру интерпретатора отдельным мьютексом — поставили один глобальный. Проще, быстрее, работает.
➡️ Когда это стало проблемой
Середина 2000-х: производители чипов упёрлись в потолок частоты и начали наращивать ядра. Внезапно concurrency без parallelism — это ограничение, а не фича.
➡️ Что меняется
Спустя 30+ лет процесс удаления GIL наконец запущен. Python сможет выполнять потоки параллельно. Кстати, если хочется parallelism прямо сейчас — можно использовать альтернативные интерпретаторы (например, на Rust), которые уже масштабируются на все ядра.
📎 Видео в посте или на YT
@zen_of_python
GIL — Global Interpreter Lock — один глобальный мьютекс на весь интерпретатор CPython. Любой поток, который хочет выполнить Python-код, должен сначала захватить этот lock. Один lock = только один поток работает в любой момент времени.
В 1991 году, когда появился Python, многоядерных CPU практически не было. Потоки добавили в язык в середине 90-х, и вместо того чтобы защищать каждую внутреннюю структуру интерпретатора отдельным мьютексом — поставили один глобальный. Проще, быстрее, работает.
«Нам казалось, что мы нормально разобрались с потоками. Многоядерных процессоров тогда всё равно ни у кого не было» — Гвидо ван Россум
Середина 2000-х: производители чипов упёрлись в потолок частоты и начали наращивать ядра. Внезапно concurrency без parallelism — это ограничение, а не фича.
Спустя 30+ лет процесс удаления GIL наконец запущен. Python сможет выполнять потоки параллельно. Кстати, если хочется parallelism прямо сейчас — можно использовать альтернативные интерпретаторы (например, на Rust), которые уже масштабируются на все ядра.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2🥰1
Напомнию, что есть канал по нейронкам, который ведёт тот же автор, что и этот канал. Это всё часть медиа Tproger, где я работаю.
⚡️ Основная фишка — на все свежие ИИ-релизы я делаю посты, чтобы вы могли читать только один канал. Иногда получается даже раньше официального запуска, чем я особенно горжусь :)
И есть моя любимая рубрика:
➡️ Обзор трендов Hugging Face за неделю с супер-кратким описанием моделей, выходит регулярно.
Иногда закидываю мемчики или что-то полезное для изучения (о, это очень крутая книга, рекомендую если раньше не видели).
Заходите и подписывайтесь: @neuro_channel
И есть моя любимая рубрика:
Иногда закидываю мемчики или что-то полезное для изучения (о, это очень крутая книга, рекомендую если раньше не видели).
Заходите и подписывайтесь: @neuro_channel
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🔥1👌1
Состоялся релиз pyauto-desktop — современной замены PyAutoGUI с поддержкой HiDPI
Если автоматизировали десктоп через PyAutoGUI — знаете боль: скрипт ломается при смене разрешения, на 4K всё едет, мультимонитор не работает. Новая библиотека решает это.
Отличия от PyAutoGUI
🔘 Автоскейлинг координат и изображений через Session-логику
🔘 До 5x быстрее (mss + Pyramid Template Matching + кэширование)
🔘 locateAny / locateAll из коробки вместо циклов
🔘 Встроенный GUI Inspector: снипы, редактор, генерация кода
🔘 Бэкенд: opencv-python, mss, pynput
Из комментариев
📎 Код на GitHub, на видео демо
@zen_of_python
Если автоматизировали десктоп через PyAutoGUI — знаете боль: скрипт ломается при смене разрешения, на 4K всё едет, мультимонитор не работает. Новая библиотека решает это.
Отличия от PyAutoGUI
Из комментариев
Session management, который абстрагирует DPI — это то, чего не хватало PyAutoGUI
@zen_of_python
This media is not supported in your browser
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Pyrethrin — exhaustive error handling для Python, теперь с обёртками для pandas/numpy/FastAPI
Библиотека, которая привносит Rust-стиль обработки ошибок в Python: нельзя проигнорировать исключение, компилятор (ну, рантайм) заставит обработать все варианты.
Новое в v0.2.0: Shields
Drop-in замены для библиотек с явным объявлением исключений:
➡️ Как узнали какие исключения бросает pd.read_csv?
Автор написал отдельный инструмент Arbor для статического анализа. Для read_csv он прошёл 5,623 функции и нашёл 1,881 raise-statement — 35 типов исключений. Топ: ValueError (442), TypeError (227), NotImplementedError (87).
➡️ Философия
🔘 Нет unwrap() — никаких escape hatch, обрабатывай всё
🔘 Проверка exhaustiveness в момент вызова, не импорта
🔘 Работает с нативным match-case (Python 3.10+)
📎 GitHub, Arbor, PyPI
@zen_of_python
Библиотека, которая привносит Rust-стиль обработки ошибок в Python: нельзя проигнорировать исключение, компилятор (ну, рантайм) заставит обработать все варианты.
Новое в v0.2.0: Shields
Drop-in замены для библиотек с явным объявлением исключений:
# Было — исключения неявные
import pandas as pd
df = pd.read_csv("data.csv")
# Стало — нужно обработать все возможные ошибки
from pyrethrin.shields import pandas as pd
from pyrethrin import match, Ok
result = match(pd.read_csv, "data.csv")({
Ok: lambda df: process(df),
OSError: lambda e: log_error("File not found", e),
pd.ParserError: lambda e: log_error("Invalid CSV", e),
# ... остальные
})
Автор написал отдельный инструмент Arbor для статического анализа. Для read_csv он прошёл 5,623 функции и нашёл 1,881 raise-statement — 35 типов исключений. Топ: ValueError (442), TypeError (227), NotImplementedError (87).
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱2👍1
PCA — стандартный способ уменьшить размерность данных (1000 фичей → 50). Главная боль: нужно выбирать
🔘 Сама определяет, где заканчивается сигнал и начинается шум
🔘 Отрезает лишнее без ручного подбора
🔘 Один проход вместо кросс-валидации
➡️ Бонус для больших данных
PCA требует центрирования матрицы. Если матрица разреженная (sparse), центрирование делает её плотной — память взрывается. Библиотека умеет считать PCA на sparse-матрицах без этой проблемы.
Использование
Drop-in замена sklearn — работает в Pipeline.
📎 Код на GitHub, доки
@zen_of_python
n_components — сколько компонент оставить. Обычно либо перебор через GridSearch, либо «ну возьму 50, должно хватить». Библиотека randomized-svd решает проблему автоматически.PCA требует центрирования матрицы. Если матрица разреженная (sparse), центрирование делает её плотной — память взрывается. Библиотека умеет считать PCA на sparse-матрицах без этой проблемы.
Использование
from randomized_svd import RandomizedSVD
rsvd = RandomizedSVD(n_components=100, rank_selection='auto')
X_reduced = rsvd.fit_transform(X) # сама выберет сколько компонент нужно
Drop-in замена sklearn — работает в Pipeline.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🤝1
calgebra — алгебра множеств для календарей в Python
Есть задача: найти время, когда вся команда свободна, с учётом Google Calendar, .ics файлов и рабочих часов. Обычно это превращается в ад из циклов и условий. Новый проект решает это через операторы множеств — как будто пишешь SQL, но для временных интервалов.
Как это работает
Операторы:
➡️ Чем отличается от аналогов
🔘 icalendar / ics.py — только парсят .ics, calgebra добавляет запросы и композицию
🔘 gcsa — CRUD для Google Calendar, calgebra даёт set-операции поверх
🔘 dateutil.rrule — генерирует повторения, но не умеет пересекать/вычитать таймлайны
➡️ Фичи
🔘 Поддержка RFC 5545 (повторяющиеся события)
🔘 Фильтры по длительности, метаданным, кастомным атрибутам
🔘 Импорт/экспорт .ics через file_to_timeline и timeline_to_file
🔘 Интеграция с Google Calendar
🔘 Type hints для IDE и агентов
➡️ Кому пригодится
Разработчикам scheduling-фич, интеграций с календарями, систем проверки availability. Автор отмечает, что API удобен для ИИ-агентов благодаря композируемости и типизации.
📎 Код на GitHub, на видео демо работы ИИ-агента с calgebra
@zen_of_python
Есть задача: найти время, когда вся команда свободна, с учётом Google Calendar, .ics файлов и рабочих часов. Обычно это превращается в ад из циклов и условий. Новый проект решает это через операторы множеств — как будто пишешь SQL, но для временных интервалов.
Как это работает
from calgebra import day, time_of_day, HOUR
# Рабочие часы
work_hours = day("weekday") & time_of_day(start=9*HOUR, duration=8*HOUR)
# Календари команды
team = alice | bob | charlie
# Свободное время для встречи от 2 часов
free = (work_hours - team).filter(hours >= 2)
Операторы:
| (объединение), & (пересечение), - (разность), ~ (дополнение). Ленивые вычисления — выражение выполняется только при слайсинге.Разработчикам scheduling-фич, интеграций с календарями, систем проверки availability. Автор отмечает, что API удобен для ИИ-агентов благодаря композируемости и типизации.
@zen_of_python
This media is not supported in your browser
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤1
Forwarded from Метод утёнка
Если взять конкретный язык, то всё может быть ещё хуже.
В Python, например, тип
🔘 PyObject header — счётчик ссылок + указатель на тип (~16 байт на 64-бит)
🔘 PyLongObject — структура для хранения целых чисел произвольной длины (~12 байт дополнительно)
Можно проверить самостоятельно:
Почему так расточительно?
Python оптимизирован для удобства и гибкости, а не для экономии памяти. Зато True и False — синглтоны (существует только по одному экземпляру каждого), так что в реальных программах это не создаёт проблем.
Для компактного хранения множества булевых значений используют
@devs_books
В Python, например, тип
bool наследуется от int, поэтому True и False — это полноценные объекты — целые числа. Каждый объект в CPython несёт накладные расходы:Можно проверить самостоятельно:
import sys
print(sys.getsizeof(True)) # 28
print(sys.getsizeof(False)) # 28
Почему так расточительно?
Python оптимизирован для удобства и гибкости, а не для экономии памяти. Зато True и False — синглтоны (существует только по одному экземпляру каждого), так что в реальных программах это не создаёт проблем.
Для компактного хранения множества булевых значений используют
numpy.array с dtype=bool (1 байт на значение) или битовые массивы.@devs_books
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔4❤2
Один начинающий программист читал Effective Python и завис на первой главе про форматирование строк. Искал что-то типа Pythex, но для f-strings — не нашёл. Попросил Claude сделать HTML-приложение по спеке.
Получился вот такой сайт с визуализацией форматирования строк в питоне.
Format spec mini-language выглядит так:
И когда видишь
Примеры того, что можно форматировать
Выравнивание, заполнение, знаки, разделители тысяч, точность — всё в одной строке.
📎 Код на GitHub, демо на сайте
@zen_of_python
Получился вот такой сайт с визуализацией форматирования строк в питоне.
Format spec mini-language выглядит так:
[[fill]align][sign][#][0][width][grouping_option][.precision][type]
И когда видишь
f'{value:0>10.2f}' — не сразу понятно, что где. Визуализатор разбирает строку на части и показывает, за что отвечает каждый символ.
Примеры того, что можно форматировать
f'{3.14159:.2f}' # → '3.14'
f'{"test":#>10}' # → '######test'
f'{12345:,}' # → '12,345'
f'{-42:010}' # → '-000000042'Выравнивание, заполнение, знаки, разделители тысяч, точность — всё в одной строке.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤🔥4❤3
dbgpu — база 2000+ видеокарт с TechPowerUp в Python
Python-пакет для работы со спецификациями GPU. Парсит TechPowerUp, отдаёт структурированные данные. MIT лицензия.
Установка и использование
Поддерживает NVIDIA, AMD, Intel, ATI, 3dfx, Matrox — всё, что есть на TechPowerUp.
Внутри ~50 полей на карту: архитектура, техпроцесс (нм), транзисторы, die size, частоты (base/boost/memory), память (тип, объём, шина, bandwidth), шейдерные юниты, TMU, ROP, SM, tensor/RT cores, кэши L1/L2, TDP, размеры платы, разъёмы питания и видеовыходы, версии API (DirectX, OpenGL, Vulkan, OpenCL, CUDA, Shader Model), производительность FP16/FP32/FP64.
В релизах на GitHub лежат готовые JSON/CSV/PKL. Последний полный билд — декабрь 2025.
Можно спарсить свежую базу самостоятельно:
Rate limit 4 req/min. Полный проход по всем GPU — 10+ часов.
📎 Код на GitHub
@zen_of_python
Python-пакет для работы со спецификациями GPU. Парсит TechPowerUp, отдаёт структурированные данные. MIT лицензия.
Установка и использование
pip install dbgpu
dbgpu lookup "GeForce RTX 4090"
from dbgpu import GPUDatabase
db = GPUDatabase.default()
spec = db["GeForce RTX 4090"]
# или нечёткий поиск: db.search("4090")
Поддерживает NVIDIA, AMD, Intel, ATI, 3dfx, Matrox — всё, что есть на TechPowerUp.
Внутри ~50 полей на карту: архитектура, техпроцесс (нм), транзисторы, die size, частоты (base/boost/memory), память (тип, объём, шина, bandwidth), шейдерные юниты, TMU, ROP, SM, tensor/RT cores, кэши L1/L2, TDP, размеры платы, разъёмы питания и видеовыходы, версии API (DirectX, OpenGL, Vulkan, OpenCL, CUDA, Shader Model), производительность FP16/FP32/FP64.
В релизах на GitHub лежат готовые JSON/CSV/PKL. Последний полный билд — декабрь 2025.
Можно спарсить свежую базу самостоятельно:
pip install dbgpu[build]
dbgpu build --manufacturer NVIDIA --start-year 2023
Rate limit 4 req/min. Полный проход по всем GPU — 10+ часов.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👎1
Библиотеку packaging ускорили в 3 раза
packaging — это библиотека, которую использует почти всё в Python-экосистеме для работы с версиями и зависимостями. Она встроена в pip, а pip встроен в Python — так что это буквально самая распространённая сторонняя библиотека в мире.
Когда pip резолвит зависимости, он создаёт миллионы объектов Version и SpecifierSet. Буквально миллионы — в бенчмарке, который использовал автор, было 4,8 миллиона. Каждый раз парсится регулярка, создаются объекты, сравниваются версии. Это занимает время.
➡️ Что сделал мейнтейнер библиотеки?
Взял новый статистический профайлер из Python 3.15, прогнал через него реальные данные (все версии когда-либо загруженные на PyPI) и нашёл узкие места.
Оказалось, что регулярка — не главная проблема. Основное время уходило на:
🔘 Создание лишних объектов (NamedTuple внутри Version — убрал, +20%)
🔘 Дублирование работы (Version создавался дважды в одном месте — исправил, +37%)
🔘 Неоптимальный код (генераторы вместо map, singledispatch вместо if — переписал)
Результат:
🔘 Чтение версий: 19,6 сек → 9,9 сек (2x)
🔘 Проверка requires-python: 105 сек → 33,9 сек (3x)
🔘 Количество создаваемых Version в pip: 4,8M → 400K
Все исправления будут в версии 26, уже вышла rc1, финальный релиз обещают на днях.
@zen_of_python
packaging — это библиотека, которую использует почти всё в Python-экосистеме для работы с версиями и зависимостями. Она встроена в pip, а pip встроен в Python — так что это буквально самая распространённая сторонняя библиотека в мире.
Когда pip резолвит зависимости, он создаёт миллионы объектов Version и SpecifierSet. Буквально миллионы — в бенчмарке, который использовал автор, было 4,8 миллиона. Каждый раз парсится регулярка, создаются объекты, сравниваются версии. Это занимает время.
Взял новый статистический профайлер из Python 3.15, прогнал через него реальные данные (все версии когда-либо загруженные на PyPI) и нашёл узкие места.
Оказалось, что регулярка — не главная проблема. Основное время уходило на:
Результат:
Все исправления будут в версии 26, уже вышла rc1, финальный релиз обещают на днях.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤🔥6
Niquests — это современная версия requests: быстрее и с поддержкой новых фич протокола HTTP/2 и HTTP/3. Автор позиционирует вообще как самую быструю и показывает бенчмарки с обгоном httpx и aiohttp по количеству запросов в секунду.
Основная фишка — вместо кучи соединений используется настоящий HTTP/2+ multiplexing — много запросов через несколько установленных коннектов. На больших нагрузках это решает. По сути это то, как делают запросы современные браузеры.
Drop-in замена для requests — тот же API, просто меняешь импорт. При этом автоматически работает HTTP/1.1, HTTP/2 и HTTP/3 — либа выбирает лучший протокол сама. Есть Async, WebSocket через HTTP/1, 2, 3, DNS‑over‑HTTPS, DNSSEC и поддержка нового питона без GIL.
Если просто иногда дёргаете один‑два API — можно не париться и оставаться на той либе, что сейчас используете. Если хотя бы сотни запросов, то можно попробовать получить прирост скорости просто заменой импорта.
📎 Код на GitHub, на видео тот самый бенчмарк
@zen_of_python
Основная фишка — вместо кучи соединений используется настоящий HTTP/2+ multiplexing — много запросов через несколько установленных коннектов. На больших нагрузках это решает. По сути это то, как делают запросы современные браузеры.
Drop-in замена для requests — тот же API, просто меняешь импорт. При этом автоматически работает HTTP/1.1, HTTP/2 и HTTP/3 — либа выбирает лучший протокол сама. Есть Async, WebSocket через HTTP/1, 2, 3, DNS‑over‑HTTPS, DNSSEC и поддержка нового питона без GIL.
Если просто иногда дёргаете один‑два API — можно не париться и оставаться на той либе, что сейчас используете. Если хотя бы сотни запросов, то можно попробовать получить прирост скорости просто заменой импорта.
@zen_of_python
This media is not supported in your browser
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🆒6