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 (всего исправлений: 10)

Явные ленивые импорты (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
()

Оооо… Щас опять все модули и скрипты похерятся…

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

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

Обновлять «системный» python безопасно стоит где-то через годик после релиза новой версии, если вообще есть смысл в этом. Если хочется потыкать новую версию, есть virtualenv, uv venv.

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

Обновлять «системный» python

Он такой же «системный», как и приложения на его основе.

> pkg info -r python315
python315-3.15.0:
	at-spi2-core-2.60.4
	codec2-1.2.0
	gettext-tools-1.0
	glib-2.88.3,2
	gobject-introspection-1.86.0,1
	graphene-1.10.8_1
	gtk-doc-1.36.1
	gtk2-2.24.33_1
	gtk3-3.24.52
	gtk4-4.20.4
	json-glib-1.10.8
	libdbusmenu-16.04.0_8
	libinput-1.31.1
	libreoffice-26.8.0.3_2
	libsecret-0.21.7_2
	llvm22-22.1.8_1
	llvm23-23.1.3
	mate-desktop-1.28.2_1
	mate-menus-1.28.1
	meson-1.12.1,1
	ninja-1.13.2,4
	pulseaudio-17.0_5
	py315-Babel-2.18.0
	py315-Jinja2-3.1.6
	py315-arrow-1.4.0
	py315-attrs-26.1.0
	py315-beartype-0.22.9_2
	py315-berkeleydb-18.1.15
	py315-boolean.py-5.0
	py315-build-1.6.1
	py315-calver-2025.10.20
	py315-click-8.3.1
	py315-cyclonedx-python-lib-11.12.0
	py315-cython-3.2.9
	py315-defusedxml-0.7.1_1
	py315-docutils-0.22.4,1
	py315-evdev-1.9.1_1
	py315-flit-core-3.12.0
	py315-fqdn-1.5.0
	py315-gi-docgen-2026.1
	py315-hatch-fancy-pypi-readme-25.1.0
	py315-hatch-vcs-0.5.0_1
	py315-hatchling-1.32.4
	py315-idna-3.20
	py315-installer-1.0.1
	py315-interegular-0.3.3_1
	py315-isoduration-20.11.0_1
	py315-jsonpointer-2.0_1
	py315-jsonschema-4.26.0
	py315-jsonschema-specifications-2025.9.1
	py315-lark-1.3.1
	py315-license-expression-30.4.4
	py315-lxml-6.1.3
	py315-markdown-3.10.3
	py315-markupsafe-3.0.3
	py315-maturin-1.15.0_1
	py315-meson-python-0.22.1,1
	py315-numpy-2.4.6_1,1
	py315-orjson-3.11.9_2
	py315-packageurl-python-0.17.6
	py315-packaging-26.3
	py315-pathspec-1.1.1
	py315-pluggy-1.6.0
	py315-ply-3.11_1
	py315-poetry-core-2.5.0
	py315-py-serializable-2.1.0
	py315-pycairo-1.29.1
	py315-pygments-2.21.0
	py315-pygobject-3.58.0
	py315-pyparsing-3.3.3
	py315-pyproject-hooks-1.3.3
	py315-pyproject-metadata-0.12.1
	py315-python-dateutil-2.9.0
	py315-pyudev-0.24.1_1
	py315-pyyaml-6.0.3_1
	py315-rdflib-7.6.0
	py315-referencing-0.37.0
	py315-rfc3339-validator-0.1.4_1
	py315-rfc3986-validator-0.1.1_1
	py315-rfc3987-syntax-1.1.0
	py315-rpds-py-2026.6.3
	py315-semantic-version-2.10.0_1
	py315-setuptools-63.1.0_3
	py315-setuptools-rust-1.13.0
	py315-setuptools-scm-9.2.2
	py315-six-1.17.0
	py315-smartypants-2.0.2
	py315-sortedcontainers-2.4.0_1
	py315-sqlite3-3.15.0_10
	py315-toml-0.10.2_1
	py315-tomlkit-0.15.1
	py315-trove-classifiers-2026.9.21.13
	py315-typogrify-2.1.0
	py315-tzdata-2026.5
	py315-uri-template-1.3.0
	py315-uritools-6.1.3
	py315-webcolors-24.8.0
	py315-wheel-0.48.0
	py315-wheel044-0.44.0_1
	py315-xmltodict-1.0.4
	pygobject-common-3.58.0
	vigra-1.12.4_1
	xfce4-screensaver-4.20.2
	xfce4-settings-4.20.5
iZEN ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.