EVE Online переезжает с Python 2.7 на Python 3. Прошлый раз версию интерпретатора в игре меняли в 2010 году.
CCP рассказала 25 августа, из чего эта работа состоит. Кодовая база — 2,4 млн строк Python примерно в 20 тысячах файлов, поверх 23 лет данных живых игроков: персонажи, навыки, имущество, ISK. Часть кода написана по правилам Python 2.3 и 2.5, которые тройка уже не принимает.
Первый этап — сделать код совместимым сразу с обеими версиями, продолжая запускаться на 2.7; помогают
Опаснее другое: нашлось около 20 тысяч строк, синтаксически корректных в обеих версиях, но работающих по-разному. Классика —
Отдельное ограничение — сервер Tranquility должен оставаться доступным 23,75 часа из каждых 24.
@zen_of_python
CCP рассказала 25 августа, из чего эта работа состоит. Кодовая база — 2,4 млн строк Python примерно в 20 тысячах файлов, поверх 23 лет данных живых игроков: персонажи, навыки, имущество, ISK. Часть кода написана по правилам Python 2.3 и 2.5, которые тройка уже не принимает.
Первый этап — сделать код совместимым сразу с обеими версиями, продолжая запускаться на 2.7; помогают
python-future и 2to3. При компиляции обоими интерпретаторами 95,9% файлов собрались сразу. Осталось около 3300 строк с явными несовместимостями: примерно 1500 старых print, 800 литералов вида 123L, 600 старых форм except и 50 операторов <>.Опаснее другое: нашлось около 20 тысяч строк, синтаксически корректных в обеих версиях, но работающих по-разному. Классика —
1 / 2, которое даёт 0 в Python 2 и 0.5 в Python 3.Отдельное ограничение — сервер Tranquility должен оставаться доступным 23,75 часа из каждых 24.
@zen_of_python
❤7🌚1
Polars 1.44.0 вышел 24 августа, и основная работа в нём пришлась на SQL-слой и на Iceberg.
🔘 Общие табличные выражения теперь кэшируются, а cross join, который раньше появлялся при декорреляции подзапросов в предикатах равенства, устраняется. Неквалифицированные предикаты соединения опускаются до inner join.
🔘 В SQL добавили коррелированные подзапросы с
🔘 Нативный
🔘
🔘 При разрешении схемы в
🔘 Параметр
Чисел по скорости в релизе нет, так что заявлять конкретное ускорение не станем.
@zen_of_python
IN и квантифицированные сравнения с подзапросом.scan_iceberg понимает эволюцию схемы, deletion vectors третьей версии и свойства снапшотов, а пути к объектному хранилищу принимает напрямую.join_where поддерживает больше типов соединения, появились скалярные произведения для массивов фиксированного размера и метод struct.drop().__arrow_c_stream__ Polars освобождает GIL. Отдельно починили порчу данных во вложенных LargeList при работе через Arrow.rechunk у функций чтения и сканирования вместе с Expr.rechunk() объявлены устаревшими.Чисел по скорости в релизе нет, так что заявлять конкретное ускорение не станем.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Актуальный
Если клиент создаётся без своего
🔘
🔘 Собственный
🔘 Проверка TLS-сертификатов переехала с
Третий пункт бьёт по проду: минимальный образ без системных CA-сертификатов, корпоративный прокси, чей корень лежал только в certifi, свой доработанный бандл — во всех этих случаях верификация может начать падать. Поднимается либо установкой CA в системное хранилище, либо явным бандлом через
Инструкция по миграции лежит в репозитории SDK — там же про изменения в исключениях транспорта, event hooks и моках через RESPX.
openai — 3.5.0 — не тянет за собой httpx. В зависимостях SDK стоит httpx2: отдельный пакет, в который команда Pydantic перенесла сопровождение httpx, потому что оригинал последнее время почти не развивался, а сам он, по формулировке Pydantic, «лежит в критическом пути слишком многих продакшен-систем».Если клиент создаётся без своего
http_client, вызовы, разбор ответов, стриминг, ретраи и числовые таймауты работают как раньше. Смотреть стоит в три места.import httpx в вашем коде упадёт, если пакет приезжал только вместе с SDK и никто больше его не ставит. Лечится строчкой httpx в зависимостях или переносом импортов на httpx2.http_client собирается из нового пакета — DefaultHttpx2Client, httpx2.Timeout, httpx2.HTTPTransport.certifi на системное хранилище доверенных корней, и сам certifi SDK тоже больше не ставит.Третий пункт бьёт по проду: минимальный образ без системных CA-сертификатов, корпоративный прокси, чей корень лежал только в certifi, свой доработанный бандл — во всех этих случаях верификация может начать падать. Поднимается либо установкой CA в системное хранилище, либо явным бандлом через
SSL_CERT_FILE или каталогом в SSL_CERT_DIR (обе переменные читаются при trust_env=True, это значение по умолчанию), либо своим ssl.SSLContext в параметре verify.Инструкция по миграции лежит в репозитории SDK — там же про изменения в исключениях транспорта, event hooks и моках через RESPX.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Отключение GIL ускоряет не всё и берёт плату памятью. Хосе Даниэль Монтойя Саласар сравнил сборки Python 3.14.2 с GIL и без него на четырёх классах нагрузок, меряя время, загрузку ядер, память и потраченную энергию.
На распараллеливаемых задачах с независимыми данными свободнопоточная сборка сокращает время до 4 раз, и энергия падает примерно во столько же. На последовательных выигрыша нет вовсе, а энергии тратится на 13–43 процента больше. Там, где потоки часто читают и меняют одни и те же объекты, ускорение меньше или уходит в минус из-за конкуренции за блокировки.
Энергия во всех замерах пропорциональна времени: снятие GIL почти не меняет мощность, даже когда загрузка ядер вырастает в десять раз.
Память растёт почти везде, виртуальная заметнее физической. Причины — блокировка на каждый объект, дополнительные механизмы потокобезопасности в рантайме и новый аллокатор.
@zen_of_python
На распараллеливаемых задачах с независимыми данными свободнопоточная сборка сокращает время до 4 раз, и энергия падает примерно во столько же. На последовательных выигрыша нет вовсе, а энергии тратится на 13–43 процента больше. Там, где потоки часто читают и меняют одни и те же объекты, ускорение меньше или уходит в минус из-за конкуренции за блокировки.
Энергия во всех замерах пропорциональна времени: снятие GIL почти не меняет мощность, даже когда загрузка ядер вырастает в десять раз.
Память растёт почти везде, виртуальная заметнее физической. Причины — блокировка на каждый объект, дополнительные механизмы потокобезопасности в рантайме и новый аллокатор.
@zen_of_python
🤣2❤1
В стандартной библиотеке 3.15 появился профилировщик, который цепляется к работающему процессу по PID
Профиль с прода снять обычно нечем:
В Python 3.15 добавили
🔘 куда целиться:
🔘 что мерить:
🔘 форматы вывода:
🔘 есть живой TUI в духе top через
Авторы — Пабло Галиндо и Ласло Кишш Коллар. Раздел в What's New описывает все режимы; финал 3.15 ожидается в октябре, сейчас доступен rc1.
@zen_of_python
Профиль с прода снять обычно нечем:
profiling.tracing инструментирует каждый вызов функции и заметно тормозит программу, а перезапускать сервис ради замера никто не даст. Из-за этого «тормозит в бою, на стенде не воспроизводится» годами оставалось без ответа.В Python 3.15 добавили
profiling.sampling, он же Tachyon: семплирующий профилировщик, который периодически снимает стеки уже запущенного процесса. Код менять не нужно, перезапускать не нужно, накладные расходы околонулевые. Частота семплирования — до 1 000 000 Гц, на момент добавления это самый быстрый семплирующий профилировщик для Python.attach по PID к живому процессу, run — скрипт с самого старта, run -m — модуль, dump — одноразовый снимок стеков всех потоков, чтобы понять, на чём висит зависший процесс (с --async-aware — по всем задачам asyncio);--mode wall по умолчанию считает календарное время вместе с ожиданием ввода-вывода, --mode cpu — только счёт, --mode gil показывает, какой поток держит GIL, --mode exception берёт пробы только с потоков с активным исключением;--pstats, --collapsed для FlameGraph и speedscope, --flamegraph — самодостаточный HTML на D3.js, --gecko для Firefox Profiler, --heatmap — построчная тепловая карта по файлам;--live и профилирование до уровня байткода через --opcodes.Авторы — Пабло Галиндо и Ласло Кишш Коллар. Раздел в What's New описывает все режимы; финал 3.15 ожидается в октябре, сейчас доступен rc1.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
Django опросил 3500 разработчиков: ядро скучное, всё вокруг него бурлит
28 августа Django Software Foundation и PyCharm опубликовали ежегодный The State of Django: почти 3500 ответов из более чем 40 стран, от студентов до людей с десятилетиями стажа.
Ядро держится на месте, и авторы называют это комплиментом: зрелое, но не застывшее. PostgreSQL держит 76–79% пятый год подряд, штатный шаблонизатор — около 80%, а 43% опрошенных уже перешли на Django 6.0 через несколько месяцев после выхода.
Меняется обвязка. Совсем без ИИ-инструментов работают 10% опрошенных; из тех, кто ими пользуется, 58% делают это ежедневно и ещё 27% несколько раз в неделю.
🔘 лидера среди инструментов нет: Claude Code — 35%, ChatGPT — 33%, GitHub Copilot — 23%, а интерфейсы делятся почти поровну между браузером, IDE и командной строкой;
🔘 56% пользователей ИИ применяют его только для советов в чате;
🔘 работа с агентами остаётся поднадзорной: 59% просят сгенерировать код и вносят правки сами, 44% разрешают править файлы и запускать команды по прямому указанию, и только 27% дают довести до конца многошаговую задачу;
🔘 официальная документация Django остаётся главным источником обучения с 67%, но ИИ-инструменты уже вторые с 51% — впереди YouTube, чтения исходников и Stack Overflow.
@zen_of_python
28 августа Django Software Foundation и PyCharm опубликовали ежегодный The State of Django: почти 3500 ответов из более чем 40 стран, от студентов до людей с десятилетиями стажа.
Ядро держится на месте, и авторы называют это комплиментом: зрелое, но не застывшее. PostgreSQL держит 76–79% пятый год подряд, штатный шаблонизатор — около 80%, а 43% опрошенных уже перешли на Django 6.0 через несколько месяцев после выхода.
Меняется обвязка. Совсем без ИИ-инструментов работают 10% опрошенных; из тех, кто ими пользуется, 58% делают это ежедневно и ещё 27% несколько раз в неделю.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
uv экономит место в кэше и проверяет архив до распаковки
Менеджер пакетов uv получил две правки для кэша. Одна сокращает число одинаковых распакованных файлов, другая останавливает архив с неверным хешем до записи его содержимого.
Изменения вошли в версию 0.12.7. Новая preview-функция
Проверка архивов с исходниками тоже сдвинулась раньше. Если хеш не совпадает с ожидаемым, uv отклоняет архив до попадания распакованных файлов в кэш. В прежнем порядке повреждённый или подменённый архив успевал там осесть.
Ещё релиз добавляет разрешение зависимостей для платформ
@zen_of_python
Менеджер пакетов uv получил две правки для кэша. Одна сокращает число одинаковых распакованных файлов, другая останавливает архив с неверным хешем до записи его содержимого.
Изменения вошли в версию 0.12.7. Новая preview-функция
content-addressed-cache дедуплицирует распакованные wheel по содержимому. Одинаковые файлы теперь могут храниться в одной копии вместо десятка повторов в кэше.Проверка архивов с исходниками тоже сдвинулась раньше. Если хеш не совпадает с ожидаемым, uv отклоняет архив до попадания распакованных файлов в кэш. В прежнем порядке повреждённый или подменённый архив успевал там осесть.
Ещё релиз добавляет разрешение зависимостей для платформ
s390x, ppc64le и loongarch64. К 30 августа релиз отметили реакциями 22 человека.@zen_of_python
🎉4
Ruff замечает синхронный HTTP-запрос внутри async-функции
Линтер Ruff получил проверку синхронных HTTP-запросов внутри асинхронных функций. Она показывает место, где один обычный вызов может остановить событийный цикл всего сервиса.
Новое правило
В preview появились селекторы категорий правил. С ними можно включать целые группы проверок вместо перечисления отдельных кодов.
Релиз также уточняет две существующие проверки.
@zen_of_python
Линтер Ruff получил проверку синхронных HTTP-запросов внутри асинхронных функций. Она показывает место, где один обычный вызов может остановить событийный цикл всего сервиса.
Новое правило
ASYNC210 вошло в версию 0.16.5. Такая ошибка легко прячется в коде: функция объявлена через async, однако блокирующий запрос задерживает выполнение остальных задач. Из-за этого асинхронный сервис незаметно теряет ожидаемое поведение под нагрузкой.В preview появились селекторы категорий правил. С ними можно включать целые группы проверок вместо перечисления отдельных кодов.
Релиз также уточняет две существующие проверки.
DTZ007 перестал ругаться на безопасные цепочки strptime с таймзоной. Отдельно SIM401 теперь учитывает побочные эффекты в аргументах по умолчанию у lambda.@zen_of_python
GitHub
Release 0.16.5 · astral-sh/ruff
Release Notes
Released on 2026-08-27.
Preview features
Allow rules without codes (#28049)
Introduce category selectors (#27666)
Update preview default rules and categories (#27877)
Bug fixes
[fl...
Released on 2026-08-27.
Preview features
Allow rules without codes (#28049)
Introduce category selectors (#27666)
Update preview default rules and categories (#27877)
Bug fixes
[fl...
🔥7❤1
В документации Python появилась таблица цены каждой операции со встроенными типами
Сколько стоит
Такое сохраняют: половина вопросов «почему тормозит» на ревью и собеседованиях закрывается этой таблицей.
Страница в документации
@zen_of_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 прокручивает вашу программу по шагам прямо в браузере
Результат неверный, а где именно состояние поехало — непонятно, и код обрастает
Ставить ничего не нужно, регистрации нет, код вставляется прямо на странице. Кроме Python поддерживаются Java, C, C++ и JavaScript. С 2010 года сервисом воспользовались больше 25 млн человек, он построил свыше 500 млн визуализаций.
В нашем канале «Точка входа» разобрали подробнее.
Результат неверный, а где именно состояние поехало — непонятно, и код обрастает
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 и тестов совместимости он и предназначен
Ставится через
Что означает заморозка ABI, сколько даёт JIT и что проверить мейнтейнеру разобрали на сайте.
@zen_of_python
Второй релиз-кандидат опубликован 1 сентября: 144 исправления от 76 участников после rc1. Главное в нём то, чего уже не будет: ABI заморожен, и wheels, собранные на rc2, будут работать с финальной 3.15 и всеми её патч-версиями. Значит, мейнтейнеры расширений на C могут собирать и выкладывать колёса под 3.15 уже сейчас.
Ставится через
uv python install 3.15.0rc2 или с python.org.Что означает заморозка ABI, сколько даёт JIT и что проверить мейнтейнеру разобрали на сайте.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
Python.org
Python Release Python 3.15.0rc2
The official home of the Python Programming Language
❤2👍1
uv 0.12.9 закрыл проблему с памятью при чтении чужих wheel и добавил CPython 3.15.0rc2
Релиз 1 сентября. Из важного:
🔘 обновлён
🔘 чувствительные заголовки больше не утекают при редиректах между зонами аутентификации, включая смену схемы на том же хосте;
🔘 секреты в подписанных URL вырезаются из диагностики повторов;
🔘 новые флаги
🔘 холодная установка wheel быстрее: каждый ZIP распаковывается в одной блокирующей задаче с переиспользованием буферов;
🔘 добавлен CPython 3.15.0rc2.
Если ставите пакеты из сторонних индексов, обновляйтесь. Заметки к релизу.
@zen_of_python
Релиз 1 сентября. Из важного:
async_http_range_reader до 0.11.1: закрыта потенциальная проблема memory-safety при чтении метаданных из недоверенных wheel по HTTP range;--no-locked и --no-frozen отключают режимы из UV_LOCKED и UV_FROZEN на один вызов, а --locked, --frozen, --check теперь важнее переменных окружения;Если ставите пакеты из сторонних индексов, обновляйтесь. Заметки к релизу.
@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
ARC-AGI-1 это тысяча задач на цветных сетках, где по паре примеров нужно угадать правило. Митхил Вакде обучил трансформер на 75 млн параметров с нуля и получил 44% на публичном eval за 1,5 часа на RTX 5090. Код открыт под MIT.
Репозиторий 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;
🔘
🔘
🔘 удалены
🔘 у скалярного
Сам Python 3.15 выходит 1 октября, второй rc был 1 сентября, так что проверить совместимость кода можно уже сейчас, а замеры с компиляцией придётся отложить. Чек-лист обновления на сайте.
@zen_of_python
PyTorch Foundation выпустила 2.14: 2995 коммитов от 487 участников.
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
❤1
Polars 2.0 RC: после обновления ваши
Polars выпустила первый release candidate версии 2.0. Автор библиотеки Ричи Винк пишет, что релиз должен быть «скучным»: новых функций почти нет, меняются дефолты. Главный из них:
Вторая часть релиза про то, чтобы падать сразу, а не через 20 минут работы пайплайна.
Поставить в отдельное окружение:
@zen_of_python
join и group_by могут вернуть строки в другом порядкеPolars выпустила первый release candidate версии 2.0. Автор библиотеки Ричи Винк пишет, что релиз должен быть «скучным»: новых функций почти нет, меняются дефолты. Главный из них:
LazyFrame.collect() теперь идёт через потоковый движок, который обрабатывает данные порциями. Авторы ожидают, что в совокупности он «легко в 5 раз быстрее», но порядок строк после join, group_by и unpivot он не гарантирует. Если код молча полагался на порядок, например брал head(1) после группировки, добавьте maintain_order (у join и 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
Что происходит между
🔘
🔘
🔘 реестр встроенных ufunc порождается скриптом
🔘 циклы собираются в нескольких вариантах под наборы инструкций (
Какой вариант реально работает у вас, покажет
@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 результата;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