LINUX.ORG.RU
Новости — Разработка (не подтверждено)  

Python 3.15

 , , , ,


0

3

https://www.python.org/downloads/release/python-3150/

9 дней … десять двадцать

Состоялся релиз Python 3.15.0: Главные новшества и прирост скорости

Спустя год разработки команда core-разработчиков представила релиз Python 3.15.0. Изначально выпуск планировался на 1 октября, но из-за критических регрессий в механизме ленивого импорта релиз-менеджеры экстренно выкатили RC3, сдвинув финальный дедлайн на неделю.

В общей сложности в ветку было влито 5643 коммита от 1012 участников сообщества. Одним из ключевых контрибьюторов версии стал наш соотечественник Никита Соболев, занявший первое место в недавнем конкурсе «Код логики» за вклад в развитие CPython.


🚀 Ключевые нововведения Python 3.15

  • Явные ленивые импорты (PEP 810): Появилось новое ключевое слово lazy. Оно позволяет объявлять импорты в начале файла, но фактически загружать модули только в момент первого обращения. Это значительно ускоряет время запуска CLI-утилит и тяжелых приложений.
  • Встроенный тип frozendict (PEP 814): Долгожданный неизменяемый и хешируемый аналог обычного словаря. Его можно использовать в качестве ключей для других словарей или для безопасного хранения конфигураций.
  • Встроенный тип sentinel (PEP 661): Предназначен для создания уникальных сигнальных объектов (взамен старого трюка с object()). Такие объекты корректно проходят проверку типов и имеют понятное строковое представление.
  • Кодировка UTF-8 по умолчанию (PEP 686): Python больше не пытается определять кодировку на основе системных локалей. Функция open() теперь всегда использует UTF-8 по умолчанию, что решает многолетние проблемы кроссплатформенности.
  • Распаковка в генераторах (PEP 798): Добавлена поддержка синтаксиса распаковки прямо внутри comprehensions (например, [*a for a in matrix]), что упрощает сглаживание списков без использования itertools.chain.
  • Новый сэмплирующий профилировщик Tachyon (PEP 799): В библиотеку встроен пакет profiling.sampling. Статистический профилировщик Tachyon подключается к запущенному процессу и делает снимки производительности почти с нулевыми накладными расходами, в отличие от замедляющего код cProfile.

Основные изменения:

  • PEP 810: Явные ленивые импорты. Добавлено новое ключевое слово lazy. С его помощью модули можно декларировать в начале файла, но реальная загрузка в память и выполнение байт-кода будут происходить только при первом обращении к объектам. Фича призвана сократить время холодного старта тяжелых CLI-утилит и веб-фреймворков.
  • PEP 814: Встроенный тип frozendict. Наконец-то в stdlib завезли из коробки полноценный неизменяемый словарь. Объект является хешируемым, что позволяет использовать его в качестве ключей для других dict или элементов set.
  • PEP 661: Встроенный тип sentinel. Стандартизирован механизм создания уникальных сигнальных объектов. Больше не нужно городить костыли вида sentinel = object(), которые ломали статический анализ. Новые синглтоны корректно обрабатываются тайп-чекерами (mypy, pyright) и имеют вменяемый строковый вывод.
  • PEP 686: UTF-8 по умолчанию. Python окончательно отказывается от попыток угадать кодировку на основе системных локалей (привет пользователям Windows). Встроенная функция open() теперь всегда открывает файлы в UTF-8, если не указано иное.
  • PEP 798: Распаковка в list comprehension. Добавлен синтаксис распаковки прямо внутри генераторов списков (например, [*item for item in matrix]). Больше не нужно импортировать itertools.chain ради базового уплощения списков.
  • PEP 799: Сэмплирующий профилировщик Tachyon. В стандартную библиотеку вошел модуль profiling.sampling. В отличие от старого cProfile, который вносил огромный overhead и искажал результаты, статистический профилировщик Tachyon работает почти с нулевыми накладными расходами, делая быстрые снимки стека запущенного процесса.

Производительность и internals:

Экспериментальный JIT-компилятор получил очередную порцию оптимизаций: прирост производительности на x86-64 (Linux) составил около 7-8%, а на архитектуре AArch64 (macOS) — до 11-12%. Для Windows-сборок компиляция теперь по умолчанию выполняется в VS 2026 с оптимизацией хвостовых вызовов (tail-calling), что дало до +20% к скорости выполнения синтетических тестов.

Стабилизирован ABI для расширений на Си с поддержкой многопоточности без GIL (свободное выполнение потоков, free-threading) — abi3t. На macOS сборки теперь идут с включенным free-threading из коробки.

⚙️ Производительность и изменения под капотом

Экспериментальный JIT-компилятор стал работать быстрее. В Linux (x86-64) он дает прирост производительности на 7–8%, а на macOS (AArch64) — на 11–12%. Официальные 64-битные сборки для Windows теперь по умолчанию используют оптимизированный интерпретатор с хвостовыми вызовами (tail-calling), собранный в VS 2026 (+15-20% скорости в тестах).

Разработчики также официально представили стабильный abi3t для расширений на Си с поддержкой свободного выполнения потоков (free-threading без GIL). На macOS сборки по умолчанию теперь устанавливаются с поддержкой free-threading.

Известные проблемы:

Разработчики предупреждают о возможных дедлоках и зависаниях GUI-приложений на базе tkinter (включая IDLE) в свежей macOS 27.0 из-за несовместимости с обновленной логикой оконного менеджера Apple. В Linux-дистрибутивах под Wayland/X11 проблем не обнаружено.

⚠️ Важное предупреждение: Разработчики предупредили пользователей macOS 27.0 о возможных зависаниях графических интерфейсов на tkinter (включая встроенную среду IDLE) из-за внутренних изменений в логике оконной системы Apple.

>>> https://www.python.org/downloads/release/python-3150/

★☆

Последнее исправление: qulinxao3 (всего исправлений: 8)

Явные ленивые импорты (PEP 810)

Пожалуй, полезная штука. Для развесистых скриптов, когда тебе нужна только одна ветка - хорошо.

Встроенный тип frozendict (PEP 814): … Его можно использовать в качестве ключей для других словарей

Это чтобы ты мог использовать словарь в качестве ключей пока используешь словарь в качестве ключей. Надеюсь, таким образом использовать не будут. А сама штука полезная.

Распаковка в генераторах (PEP 798)

О, а вот это прикольно. Явно полезным будет. Для словарей {**a for a in source} не завезли? Хотя вдруг сет имели в виду. Блин.

упрощает сглаживание списков

Это так flat перевели? Допустим. Впрочем, у меня нет варианта лучше.

Новый сэмплирующий профилировщик Tachyon (PEP 799)

Интересно. Я бы глянул (как давно я профилировщиками не пользовался).

bbc69
()

А почему про известные проблемы только один раз, когда про список изменений и производительность — по два?

💡 И кстати, а чего про производительность и нововведения по два раза, а про проблемы только один?

Я два раза не повторяю.

❗Не повторяю

CrX ★★★★★
()
Ответ на: комментарий от bbc69

frozendict

ну буквально сам такой место синтетического токена определяющего версию api

qulinxao3 ★☆
() автор топика
Ответ на: комментарий от CrX

Раньше такого не было. Новость растёт буквально на глазах. Вширь.

bbc69
()

«Основные изменения» и «Ключевые нововведения Python 3.15» дублируются. Можно сократить портянку

dynamic_cast ★
()

но из-за критических регрессий в механизме ленивого импорта релиз-менеджеры экстренно выкатили RC3, сдвинув финальный дедлайн на неделю.

К чему такая спешка?

dynamic_cast ★
()
Ответ на: комментарий от CrX

Очень важное замечание

🚀 Это очень важное замечание!

BruteForce ★★★★★
()

@qulinxao3, реакция — это, конечно, здорово, но это… Исправлять-то будем?.. :)

CrX ★★★★★
()
Ответ на: комментарий от bbc69

упрощает сглаживание списков

Это так flat перевели? Допустим. Впрочем, у меня нет варианта лучше.

«линеаризацию вложенных списков» же

GPFault ★★★★
()
Последнее исправление: GPFault (всего исправлений: 2)
Ответ на: комментарий от bbc69

уплощения

это из Нила Стивенсоновского Анафема

qulinxao3 ★☆
() автор топика

JIT-компилятор получил очередную порцию оптимизаций: прирост производительности на x86-64 (Linux) составил около 7-8%

Спасибо, не надо.

Rodegast ★★★★★
()
Ответ на: комментарий от GPFault

упрощает сглаживание списков

Это так flat перевели? Допустим. Впрочем, у меня нет варианта лучше.

«линеаризацию вложенных списков» же

Распаковка же, нет?

skyman ★★★★★
()
Ответ на: комментарий от Rodegast

JIT-компилятор получил очередную порцию оптимизаций: прирост производительности на x86-64 (Linux) составил около 7-8%

Спасибо, не надо.

Почему нет? Ладно бы его просто вводили, а увеличение перформанса то чем плоха?

skyman ★★★★★
()

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

Что будет, если при загрузке модуля в уже работающей программе произойдёт сбой? Одно дело, если модуль загружается на старте программы и она не запускается, и совсем другое, если программа уже какое-то время работает, но тут понадобился модуль и он не загружается?

scanner
()
Ответ на: комментарий от scanner

На конкретную реализацию мы посмотрим, но логично предположить ошибку: cannot import…

Что до ваших переживаний: сдуру можно один титановый шарик сломать, а другой потерять. Примерно понятно, для чего это используется и если использовать с умом, то все будет тип топ.

bbc69
()
Последнее исправление: bbc69 (всего исправлений: 1)

lazy import? Хорошечно

Про JIT надо почитать, что оно такое, в смысле встроенное или отдельно идет

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от skyman

Почему нет? ... увеличение перформанса то чем плоха?

Нормальный JIT должен увеличить производительность в разы, а увеличение на 7-8% означает что они просто нешмагли.

Rodegast ★★★★★
()

Важное предупреждение: Разработчики предупредили

что предупреждать «после» это не тоже самое что предупредить «сначало» :о)

sunjob ★★★★★
()
Последнее исправление: sunjob (всего исправлений: 1)
Ответ на: комментарий от scanner

тоже самое что и в старом импорте - ток мо в момент не настолько детерменированный - что имеет как минусы так и плюсы для неизвестного заранее круга лиц

т.е. эксепшены ловить очевидно в не рабочее время менее удобно ловить

очередной трэйдофф прикрутили что энтропит уже итак не вполне чистый(а уж после := на питоне легче стало писать тьюринг полные одностроки)

qulinxao3 ★☆
() автор топика
Ответ на: комментарий от Rodegast
  1. рубят хвост по частям

  2. «а теперь со всем этим» пытаются взлететь

в промежуточном итоге - наличие комп_врем_вып не на прямую за некоторое время (скажем за 1 до следующей выкатки релиза) при массовом использование повлияет на распределение стиля вновь писуемого кода (бямы тут ингибиторы прогресса лол) среди затачивающихся на скорость без статики и в рамках синтаксиса динамического разрешения имён в питоне

в целом ща скорость на верхнем уровне (ака цен уки на питоне) критично когда «ну совсем медленно» не случайно на щит вытащили ленивость импорта при старте - что признак

qulinxao3 ★☆
() автор топика
Ответ на: комментарий от Rodegast

Кому должен? Он и до этого перегонял всё в байт-код, тут завезли оптимизацию - хорошо. Может и развить смогут.

bbc69
()
Ответ на: комментарий от qulinxao3

наличие комп_врем_вып не на прямую за некоторое время (скажем за 1 до следующей выкатки релиза) при массовом использование повлияет на распределение стиля вновь писуемого кода (бямы тут ингибиторы прогресса лол) среди затачивающихся на скорость без статики и в рамках синтаксиса динамического разрешения имён в питоне

Люди добрые, расскажите что этот наркоман тут понаписал, а то я ничего не уразумею.

Rodegast ★★★★★
()
Ответ на: комментарий от bbc69

тут завезли оптимизацию - хорошо. Может и развить смогут.

Я это видел такую оптимизацию ещё в 2010 году для ветки 2.x. Тогда можно было подключить модуль psyco который добавлял jit с примерно тем же ускорением. И ничего... оно никому не было нужным.

Rodegast ★★★★★
()

Вчера вечером на домашнем десктопе перешёл с Python3.14 на Python3.15 с перекомпиляцией всего и вся от него зависящего. Споткнулся на компиляции qt6-base и иже с ней:

===>  Configuring for py315-spdx-tools-0.8.5_1
===>  Building for py315-spdx-tools-0.8.5_1
/usr/bin/env -i PYTHONPATH=/usr/ports/misc/py-spdx-tools/work-py315/spdx_tools-0.8.5/src:/usr/local/lib/python3.15 /usr/local/bin/python3.15 /usr/ports/misc/py-spdx-tools/files/generate-parsetag.py
Traceback (most recent call last):
  File "/usr/ports/misc/py-spdx-tools/files/generate-parsetag.py", line 7, in <module>
    import spdx_tools.spdx.parser.tagvalue.tagvalue_parser as tvp
  File "/usr/ports/misc/py-spdx-tools/work-py315/spdx_tools-0.8.5/src/spdx_tools/spdx/parser/tagvalue/tagvalue_parser.py", line 4, in <module>
    from spdx_tools.spdx.model import Document
  File "/usr/ports/misc/py-spdx-tools/work-py315/spdx_tools-0.8.5/src/spdx_tools/spdx/model/__init__.py", line 7, in <module>
    from spdx_tools.spdx.model.actor import Actor, ActorType
  File "/usr/ports/misc/py-spdx-tools/work-py315/spdx_tools-0.8.5/src/spdx_tools/spdx/model/actor.py", line 6, in <module>
    from beartype.typing import Optional
  File "/usr/local/lib/python3.15/site-packages/beartype/__init__.py", line 150, in <module>
    _init()
    ~~~~~^^
  File "/usr/local/lib/python3.15/site-packages/beartype/__init__.py", line 71, in _init
    from beartype.meta import (
    ...<4 lines>...
    )
  File "/usr/local/lib/python3.15/site-packages/beartype/meta.py", line 33, in <module>
    from beartype._util.text.utiltextversion import (
        convert_str_version_to_tuple as _convert_str_version_to_tuple)
  File "/usr/local/lib/python3.15/site-packages/beartype/_util/text/utiltextversion.py", line 15, in <module>
    from beartype.typing import Tuple
  File "/usr/local/lib/python3.15/site-packages/beartype/typing/__init__.py", line 183, in <module>
    from typing import (
    ...<35 lines>...
    )
ImportError: cannot import name 'no_type_check_decorator' from 'typing' (/usr/local/lib/python3.15/typing.py)
*** Error code 1

Stop.
make[1]: stopped making "/usr/ports/misc/py-spdx-tools/work-py315/.stage_done.spdx-tools._usr_local" in /usr/ports/misc/py-spdx-tools
*** Error code 1

Stop.
make: stopped making "all" in /usr/ports/misc/py-spdx-tools
iZEN ★★★★★
()
Ответ на: комментарий от iZEN

с Python3.14 на Python3.15 с перекомпиляцией всего и вся от него зависящего

вот людям заняться нечем, реально.

qaqa ★★
()
Ответ на: комментарий от Rodegast

Ну так одно дело сторонний модуль, другое - нативный. Я ради 8% процентов ускорения тоже не стал бы тащить сторонний модуль. Вопросы скорости как правило решаются иначе.

А нативно - всегда приятно.

bbc69
()
Ответ на: комментарий от bbc69

Ну так одно дело сторонний модуль, другое - нативный

Вот только нативный jit даёт то же ускорение что и сторонний модуль 16-ти летней давности. Это позор какой то.

Rodegast ★★★★★
()
Ответ на: комментарий от qaqa

Мощный компьютер и пара тройка часов времени поглядывать за процессом. 711 пакетов установленных для перекомпиляции ( на самом деле в нужно пересобрать в разы меньше, но я зарядил всё).

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

DeprecationWarning: ‘typing.no_type_check_decorator’ is deprecated and slated for removal in Python 3.15

Таки ждём обновления qt. Противоречивые чувства: с одной стороны, зачем ломать обратную совместимость. С другой - никто никогда не читает DeprecationWarning.

bbc69
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.