Zen of Python
18.9K subscribers
1.38K photos
202 videos
38 files
3.55K links
Полный Дзен Пайтона в одном канале

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

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

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

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

Регистрация в перечне РКН: https://tprg.ru/xZOL
Download Telegram
uv экономит место в кэше и проверяет архив до распаковки

Менеджер пакетов uv получил две правки для кэша. Одна сокращает число одинаковых распакованных файлов, другая останавливает архив с неверным хешем до записи его содержимого.

Изменения вошли в версию 0.12.7. Новая preview-функция content-addressed-cache дедуплицирует распакованные wheel по содержимому. Одинаковые файлы теперь могут храниться в одной копии вместо десятка повторов в кэше.

Проверка архивов с исходниками тоже сдвинулась раньше. Если хеш не совпадает с ожидаемым, uv отклоняет архив до попадания распакованных файлов в кэш. В прежнем порядке повреждённый или подменённый архив успевал там осесть.

Ещё релиз добавляет разрешение зависимостей для платформ s390x, ppc64le и loongarch64. К 30 августа релиз отметили реакциями 22 человека.

@zen_of_python
🎉4
Ruff замечает синхронный HTTP-запрос внутри async-функции

Линтер Ruff получил проверку синхронных HTTP-запросов внутри асинхронных функций. Она показывает место, где один обычный вызов может остановить событийный цикл всего сервиса.

Новое правило ASYNC210 вошло в версию 0.16.5. Такая ошибка легко прячется в коде: функция объявлена через async, однако блокирующий запрос задерживает выполнение остальных задач. Из-за этого асинхронный сервис незаметно теряет ожидаемое поведение под нагрузкой.

В preview появились селекторы категорий правил. С ними можно включать целые группы проверок вместо перечисления отдельных кодов.

Релиз также уточняет две существующие проверки. DTZ007 перестал ругаться на безопасные цепочки strptime с таймзоной. Отдельно SIM401 теперь учитывает побочные эффекты в аргументах по умолчанию у lambda.

@zen_of_python
🔥71
В документации Python появилась таблица цены каждой операции со встроенными типами

Сколько стоит l.insert(), почему l.pop() дешёвый, а l.pop(0) нет и чем x in set отличается от x in list — раньше за этим ходили в вики или в исходники CPython. Теперь в документации 3.16 есть отдельная страница: сложность операций для list, tuple, dict, set, str, memoryview и range в нотации O-большое, с оговорками о том, где поведение зависит от реализации CPython.

Такое сохраняют: половина вопросов «почему тормозит» на ревью и собеседованиях закрывается этой таблицей.

Страница в документации

@zen_of_python
🔥16❤‍🔥2
Python Tutor прокручивает вашу программу по шагам прямо в браузере

Результат неверный, а где именно состояние поехало — непонятно, и код обрастает print. Python Tutor запускает программу на pythontutor.com и позволяет ходить по шагам вперёд и назад: видно значения переменных, как меняются списки и словари, какие объекты друг на друга ссылаются, какая функция выполняется и откуда её вызвали.

Ставить ничего не нужно, регистрации нет, код вставляется прямо на странице. Кроме Python поддерживаются Java, C, C++ и JavaScript. С 2010 года сервисом воспользовались больше 25 млн человек, он построил свыше 500 млн визуализаций.

В нашем канале «Точка входа» разобрали подробнее.
🔥1
Вышел Python 3.15.0rc2: до финала 1 октября осталось проверить свои пакеты

Второй релиз-кандидат опубликован 1 сентября: 144 исправления от 76 участников после rc1. Главное в нём то, чего уже не будет: ABI заморожен, и wheels, собранные на rc2, будут работать с финальной 3.15 и всеми её патч-версиями. Значит, мейнтейнеры расширений на C могут собирать и выкладывать колёса под 3.15 уже сейчас.

🔘 экспериментальный JIT даёт в среднем 8–9% к обычному интерпретатору на x86-64 Linux и 12–13% к tail-calling-интерпретатору на AArch64 macOS, разработчики просят прогнать на нём свои нагрузки и сообщить о регрессиях
🔘 в прод rc2 ставить не рекомендуют, для CI и тестов совместимости он и предназначен

Ставится через uv python install 3.15.0rc2 или с python.org.

Что означает заморозка ABI, сколько даёт JIT и что проверить мейнтейнеру разобрали на сайте.

@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
uv 0.12.9 закрыл проблему с памятью при чтении чужих wheel и добавил CPython 3.15.0rc2

Релиз 1 сентября. Из важного:

🔘 обновлён async_http_range_reader до 0.11.1: закрыта потенциальная проблема memory-safety при чтении метаданных из недоверенных wheel по HTTP range;
🔘 чувствительные заголовки больше не утекают при редиректах между зонами аутентификации, включая смену схемы на том же хосте;
🔘 секреты в подписанных URL вырезаются из диагностики повторов;
🔘 новые флаги --no-locked и --no-frozen отключают режимы из UV_LOCKED и UV_FROZEN на один вызов, а --locked, --frozen, --check теперь важнее переменных окружения;
🔘 холодная установка wheel быстрее: каждый ZIP распаковывается в одной блокирующей задаче с переиспользованием буферов;
🔘 добавлен CPython 3.15.0rc2.

Если ставите пакеты из сторонних индексов, обновляйтесь. Заметки к релизу.

@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥1
Повторите 44% на ARC-AGI-1 на PyTorch за полтора часа и 67 центов

ARC-AGI-1 это тысяча задач на цветных сетках, где по паре примеров нужно угадать правило. Митхил Вакде обучил трансформер на 75 млн параметров с нуля и получил 44% на публичном eval за 1,5 часа на RTX 5090. Код открыт под MIT.

🔘 задачи превращаются в последовательности токенов, модель учится авторегрессионно;
🔘 обучение во время теста: на train- и eval-задачах при скрытых ответах;
🔘 обучаемые 3D RoPE для двумерных сеток и отдельный additive embedding на задачу;
🔘 8 слоёв, SwiGLU вместо GELU, RMSNorm вместо LayerNorm, flash attention с varlen на обучении, flex attention на inference;
🔘 удаление обучения на входных токенах подняло результат с 40% до 44%, автор пишет «я не понимаю почему»;
🔘 нужны CUDA выше 12.8, лучше 13.0; на ARC-2 та же модель даёт 7%.

Репозиторий mdlARC, ограничения замера разобрали на сайте.

@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
4
PyTorch 2.14 уже собран под Python 3.15, но компилировать модели под ним пока нельзя

PyTorch Foundation выпустила 2.14: 2995 коммитов от 487 участников.

🔘 wheels для Python 3.15 и free-threaded 3.15t есть для Linux, Windows и macOS, но лежат на download․pytorch․org, не на PyPI;
🔘 torch.compile под 3.15 в этом релизе не работает и завершается RuntimeError, только eager;
🔘 torch.switch обобщает torch.cond на несколько веток, torch.while_loop захватывается CUDA Graphs;
🔘 удалены torch.cholesky, torch.qr, параметр профилировщика use_cuda; acc_policy="balanced" теперь ValueError;
🔘 у скалярного clamp градиент на границе стал 0 вместо 1, модели с клиппингом могут учиться иначе.

Сам Python 3.15 выходит 1 октября, второй rc был 1 сентября, так что проверить совместимость кода можно уже сейчас, а замеры с компиляцией придётся отложить. Чек-лист обновления на сайте.

@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Polars 2.0 RC: после обновления ваши join и group_by могут вернуть строки в другом порядке

Polars выпустила первый release candidate версии 2.0. Автор библиотеки Ричи Винк пишет, что релиз должен быть «скучным»: новых функций почти нет, меняются дефолты. Главный из них: LazyFrame.collect() теперь идёт через потоковый движок, который обрабатывает данные порциями. Авторы ожидают, что в совокупности он «легко в 5 раз быстрее», но порядок строк после join, group_by и unpivot он не гарантирует. Если код молча полагался на порядок, например брал head(1) после группировки, добавьте maintain_orderjoin и group_by) или явный sort. Старый движок возвращается через pl.Config.set_engine_affinity("in-memory").

Вторая часть релиза про то, чтобы падать сразу, а не через 20 минут работы пайплайна. is_in между Int64 и Float64 больше не округляет молча: 9007199254740993 раньше превращался в 9007199254740992 и давал ложное совпадение, теперь InvalidOperationError. Горизонтальный concat таблиц разной высоты бросает ShapeError вместо заполнения null. Вместо cast(pl.Date) только .str.to_date(), вместо каста целых в Enum только .cat.to(). В CSV без заголовка колонки теперь нумеруются с column_0. Большинство удалённых методов отвечают AttributeRemovedError с подсказкой, чем заменить.

Поставить в отдельное окружение: pip install polars==2.0rc1. Чек-лист, что проверить до финального релиза, собрали на сайте.

@zen_of_python
Что происходит между np.add(a, b) и SIMD-циклом: разбор пути одного вызова

np.add не функция Python, а объект C-типа numpy.ufunc с 22 сигнатурами в np.add.types. Файт Хеллер прослеживает, что происходит с вызовом для dd->d, двух массивов float64.

🔘 ufunc_generic_vectorcall и ufunc_generic_fastcall проверяют overrides и конвертируют аргументы;
🔘 promote_and_get_ufuncimpl и resolve_descriptors выбирают реализацию и dtype результата;
🔘 реестр встроенных ufunc порождается скриптом generate_umath.py в файл __umath_generated.c; для add bool-цикл переиспользует logical_or, а object-массивы уходят в PyNumber_Add;
🔘 циклы собираются в нескольких вариантах под наборы инструкций (X86_V2, X86_V3, NEON, ASIMD), и нужный выбирается при импорте.

Какой вариант реально работает у вас, покажет numpy.lib.introspect.opt_func_info(func_name="add", signature="float64").

@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
1
После обновления на Polars 2.0 ваши join и group_by могут вернуть строки в другом порядке

Ричи Винк выпустил первый release candidate Polars 2.0 и сам называет релиз скучным: новых функций почти нет, мажорную версию подняли, чтобы избавиться от старых решений и поменять дефолты.

Главная смена дефолта: все запросы LazyFrame теперь идут через потоковый движок, который обрабатывает данные порциями. В совокупности авторы ожидают «легко в 5 раз быстрее» и заметно меньше памяти. Плата за это в том, что порядок строк после операций больше не гарантирован.

Если код где-то молча полагался на порядок после join или group_by, он сломается тихо. К релизу выложен полный migration guide, и заглянуть в него стоит до того, как обновитесь.
Почему CPython остаётся стековой машиной, а её соседи уходят на регистры

Байткод CPython стековый: a + b это LOAD_FAST a, LOAD_FAST b, BINARY_OP. Максим Шевалье-Буавер, в прошлом автор YJIT для Ruby, измерила на своём языке Plush, сколько стоит такая модель: после перехода на регистровый байткод, где то же сложение одна инструкция с тремя операндами, медианное ускорение по тестам составило 2,07 раза, максимальное 3,37, а тесты сборщика мусора не изменились вовсе.

Замеры честные: 11 чередующихся запусков, медиана, повтор набора; в сравнении участвовал и CPython 3.14.6, но автор оговаривает разную семантику языков. Вывод один: в интерпретаторе главный рычаг это число инструкций на диспетчеризацию. Как устроено новое 64-битное слово инструкции и почему Lua ограничена 255 регистрами на фрейм, на сайте.

@zen_of_python
CPython официально поддерживает RISC-V как платформу третьего уровня

Работа шла несколько месяцев, и теперь RISC-V официально поддержан в CPython как tier 3. Для питониста это означает, что сборки под эту архитектуру перестали быть самодеятельностью и попали в зону ответственности проекта.

RISC-V это открытая система команд: в отличие от x86 и ARM, она развивается как открытый стандарт, и реализовать её может кто угодно. Экосистема за последние годы выросла заметно.

Третий уровень означает поддержку без гарантий на каждый релиз: сборка проверяется, но падение на этой платформе не блокирует выпуск. Для продакшена на RISC-V это ещё не зелёный свет, а сигнал, что можно начинать проверять свои колёса.

#cpython
Два класса с именем Helper в разных модулях затирают друг другу __value

Name mangling переименовывает __value в _Helper__value только по имени класса, без учёта модуля. Если два независимых класса Helper хранят __value, а кто-то наследуется от обоих, поле оказывается общим: один кладёт строку, другой число, сложение падает с TypeError. Именно этот пример сейчас обсуждают на форуме разработчиков Python в споре о настоящей приватности; рецепт на сегодня: одно подчёркивание и композиция вместо двойного наследования.

В нашем канале «Точка входа» разобрали подробнее.

@zen_of_python
1
Документация Python официально вышла на русском языке

Перевод объявлен официально и доступен на docs.python.org. Сделало его сообщество, и это тот случай, когда вклад волонтёров превращается в инфраструктуру языка.

Практический смысл двойной. Своим джунам теперь можно давать ссылку на официальную документацию, а не на пересказ с непонятной родословной. И при споре о терминологии появляется общая опора: как называется вещь по-русски, решает не переводчик статьи, а перевод самой документации.

Отставать от оригинала перевод будет ровно настолько, насколько его перестанут поддерживать, так что если найдёте кривое место, чинится оно пул-реквестом.
👍51
This media is not supported in your browser
VIEW IN TELEGRAM
Запрограммируй робота на Python и поборись за призовой фонд трека 7 500 000 ₽ на True Tech Champ 2026.

Попробуй себя в треке по программированию роботов. Начать проще, чем кажется: зарегистрируйся, собери команду или объединись с другими участниками на платформе и пройди квалификационный этап до 13 сентября. В онлайн-симуляторе тебе предстоит запрограммировать робособаку для доставки груза через полосу препятствий. Количество попыток не ограничено, а еще тебя будет ждать серия обучающих вебинаров.

Лучшие команды пройдут в финал и будут программировать реальных роботов на офлайн-полигоне, 22 октября, на большой сцене.
Масштабный финал объединит борьбу за призовой фонд, выступления хедлайнеров, доклады спикеров и активности для всех гостей мероприятия.

Рекомендуемые стеки: Go, Java, Python, C#, C++, JS.

Успей зарегистрироваться и пройти квалификацию до 13 сентября.

Erid:2VSb5yJrsAz
🔥1
SpaceWeb исполнилось 25 лет — и вместо скучного пресс-релиза компания вместе с Типичным программистом сделала забавную анкету. Вопросы школьные: любимый спорт, лучший друг, обои на рабочий стол. А вокруг — аська, скайп, биткоин и всё остальное, чем жил рунет с 2001 по 2026 год, плюс короткая история веба и самой компании.

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

Задача звучит тривиально: есть исходники, найди последовательности строк, которые встречаются больше одного раза. Автор Arid, чекера дублей для Python, начинал ровно с этой формулировки.

Ответ, как обычно, оказался «зависит от того, что вы имеете в виду». Переименованная переменная, другой порядок аргументов, вынесенный в константу литерал — текстуально это разный код, а по смыслу тот же самый.

Разбор интересен именно этим: как выбрать уровень абстракции, на котором сравнивать, и где проходит граница между дублем и совпадением. Полезно, если у вас в CI стоит проверка на дубли и вы не понимаете её вердиктов.