Zen of Python – Telegram
Zen of Python
19.8K subscribers
1.32K photos
197 videos
38 files
3.39K links
Полный Дзен Пайтона в одном канале

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/xZOL
Download Telegram
Pyrethrin — exhaustive error handling для Python, теперь с обёртками для pandas/numpy/FastAPI

Библиотека, которая привносит 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),
# ... остальные
})


➡️ Как узнали какие исключения бросает 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
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱2👍1
Каждый баг в 2025 — мой, натуральный, человеческий
😁22🎅16😎5👎1
PCA — стандартный способ уменьшить размерность данных (1000 фичей → 50). Главная боль: нужно выбирать 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.

📎 Код на GitHub, доки

@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🤝1
calgebra — алгебра множеств для календарей в 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)

Операторы: | (объединение), & (пересечение), - (разность), ~ (дополнение). Ленивые вычисления — выражение выполняется только при слайсинге.

➡️ Чем отличается от аналогов

🔘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
This media is not supported in your browser
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥71
Forwarded from Метод утёнка
Если взять конкретный язык, то всё может быть ещё хуже.

В Python, например, тип bool наследуется от int, поэтому True и False — это полноценные объекты — целые числа. Каждый объект в CPython несёт накладные расходы:
🔘PyObject header — счётчик ссылок + указатель на тип (~16 байт на 64-бит)
🔘PyLongObject — структура для хранения целых чисел произвольной длины (~12 байт дополнительно)

Можно проверить самостоятельно:
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
🤔42
Один начинающий программист читал Effective Python и завис на первой главе про форматирование строк. Искал что-то типа Pythex, но для f-strings — не нашёл. Попросил Claude сделать HTML-приложение по спеке.

Получился вот такой сайт с визуализацией форматирования строк в питоне.

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'

Выравнивание, заполнение, знаки, разделители тысяч, точность — всё в одной строке.

📎 Код на GitHub, демо на сайте

@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤‍🔥44
dbgpu — база 2000+ видеокарт с TechPowerUp в 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+ часов.

📎 Код на GitHub

@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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤‍🔥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
This media is not supported in your browser
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🆒91🔥1
На Reddit обсудили, с какими инструментами питонисты стартуют новые проекты в 2026. В треде 170+ комментариев, подведу краткие итоги.

uv + ruff + httpx + pytest — этот стек набрал больше всего голосов. Poetry и venv уходят в прошлое, uv забирает всё: и venv, и зависимости, и запуск скриптов.

А вот в тайп-чекинге единства нет. Одни ждут pyright, другие пробуют ty или pyrefly. Ruff сам по себе типы не проверяет, нужен отдельный инструмент.

Что ещё упоминают
🔘pydantic — почти как стандарт для валидации
🔘direnv — автоматическая активация окружения при входе в папку
🔘pandas остаётся дефолтом, но для больших данных смотрят на PySpark/Polars

Для старта нового проекта
uv init myproject
cd myproject
uv add --dev ruff pytest

Это готовый рецепт, которого пока что придерживается большинство в сообществе.

А что вы используете? Кто-то уже пробовал ty?

@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥114🤔1
Бывший CTO поделился тестом, который за 15 секунд отсеивал половину кандидатов. И это не фигура речи, реально 53% ошибались.

Я специально спрячу объяснение за спойлер, чтобы вы могли перейти по ссылке и попробовать решить задачу. Осуждать никого не будем, просто проверьте себя.

Если ваш ответ 1, то поздравляю, вы быстро в уме разобрали код и поняли логику. Если -11, то значит вы скопировали код в ChatGPT или интерпретатор и поленились делать в уме. Так же поступают в среднем 50% кандидатов.

Дело в том, что в коде спрятан знак =, который появляется только при копировании и условие меняется на >= 3. Ну и ответ, конечно, тоже.


И в чём смысл?

Не то чтобы копировать — это прям плохо. Смысл скорее в том, что для простой задачи быстрее прогнать код в голове, чем открывать терминал. Если кандидат не может выполнить три итерации цикла мысленно — это сигнал.

Автор признаёт: метод не идеальный, бывают false negatives. Но он вдвое сокращает время на обработку откликов.

@zen_of_python
🔥156
Один разработчик реализовал bytes.replace() из Python на CUDA — для обработки многогигабайтных файлов прямо на GPU без передачи данных на CPU.

Бенчмарки (RTX 3090)
🔘1 MB: 1,09x (почти одинаково)
🔘5 MB: 1,80x
🔘50 MB: 3,43x
🔘100 MB: 4,37x

Среднее ускорение: 3,45x, пропускная способность: 0,79 GB/s

Ключевые фичи
🔘Точная семантика Python (leftmost, non-overlapping replacements)
🔘Streaming mode — файлы больше VRAM обрабатываются чанками
🔘Session API — несколько замен подряд без переинициализации
🔘Thread-safe

Пример
from cuda_replace import CReplaceLib

lib = CReplaceLib()
result = lib.unified(data, b"pattern", b"replacement")

# Для больших файлов
cleaned = lib.gpu_streaming(huge_data, b"old", b"new", chunk_size=256*1024*1024)


➡️ Зачем это нужно

Автор делал GPU-компрессию и хотел убрать лишние трансферы между CPU и GPU. Другие применения: санитизация логов, обработка сетевых пакетов, любые задачи с поиском/заменой в больших бинарных данных.

И давайте признаем, это просто круто, search-replace на CUDA блин :)

📎 Код на GitHub

@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥94
Вышел pandas 3.0: строки теперь хранятся через PyArrow (до 70% экономии памяти, до 13x быстрее), а Copy-on-Write стал обязательным.

Что сломается

🔘Цепочечное присваивание больше не работает:
# Было: работало с warning'ом
df["foo"][df["bar"] > 5] = 100

# Стало: молча НЕ работает
# Правильно:
df.loc[df["bar"] > 5, "foo"] = 100


🔘Проверки dtype:
# Было
if df['col'].dtype == object: ...

# Стало
if pd.api.types.is_string_dtype(df['col']): ...


Как мигрировать
1️⃣Обновитесь до pandas 2.3, уберите warnings
3️⃣Включите в тестах: pd.options.future.infer_string = True
3️⃣Найдите dtype == object и цепочечные присваивания
4️⃣Обновляйтесь до 3.0

Требования: Python 3.11+, NumPy 1.26.0+, PyArrow 13.0.0+

Для production лучше подождать пару недель — релиз свежий.

📎 Changelog, GitHub

@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🫡5🔥1
Репозиторий anthropics/skills — самый популярный Python-репозиторий на GitHub прямо сейчас. +1400 звёзд в день, 50 тыс. уже набежало.

➡️ Что такое Skills

Skills — это папки с инструкциями и скриптами, которые Claude динамически подгружает для выполнения специализированных задач. По сути, плагины для ИИ: вместо того чтобы каждый раз объяснять модели, как работать с вашими процессами, вы описываете это один раз в файле.

Примеры: создание документов с учётом правил компании, анализ данных по специфическим воркфлоу, генерация MCP-серверов, тестирование веб-приложений.

➡️ Как устроено

Skill — это YAML с названием, описанием и markdown-инструкциями. Можно указать примеры использования и ограничения. Claude читает это при активации и следует описанным правилам.
---
name: my-skill-name
denoscription: What this skill does
---
# Instructions for Claude...


➡️ Зачем это вам

Если используете Claude для повторяющихся задач — Skills позволяют один раз описать процесс и использовать повторно. Документные skills (PDF, DOCX, XLSX) уже готовы. Для собственных — есть шаблон и примеры.

📎 Репозиторий

@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71
😁17👍6🔥3💯2
Вышел packaging 26.0 — тот самый релиз с ускорением в три раза, о котором писал пару недель назад.

Напомню контекст: packaging — библиотека для работы с версиями и зависимостями. Встроена в pip, а pip — в Python. 650+ миллионов скачиваний в месяц.

➡️ Что в релизе

Обещанные оптимизации: регулярки больше не перекомпилируются каждый раз, добавлены __slots__ для Version и Specifier, улучшено кэширование. Результат — парсинг версий стал в три раза быстрее, количество создаваемых объектов в pip упало с 4,8 млн до 400 тыс.

➡️ Новые фичи

PEP 751 — поддержка pylock-файлов для воспроизводимых установок. PEP 794 — импорт метаданных имён пакетов. Positional pattern matching для Version и Specifier — теперь работает match version:
from packaging.version import Version

match Version("3.14.0"):
case Version(major=3, minor=14):
print("Python 3.14!")


➡️ Breaking changes

.contains() теперь возвращает False вместо исключения для невалидных версий. Если ловили InvalidVersion — проверьте код.

Обновление подтянется автоматически с новыми версиями pip.

📎 Changelog, PyPI

@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
5