Эта статья — мой разбор официальных заметок о релизе. Для тех, кто любит копаться в первоисточниках и не боится простыней текста на английском — вот ссылка на официальный changelog.
Выход Python 3.14 запланирован на октябрь 2025. Python активно качает мускулы в сторону производительности и настоящего параллелизма.
Давайте разберемся, что же такого важного планируют в этой версии.
C версии 3.14 удаление GIL стало официальной стратегией. Несколько ключевых PEP направлены именно на то, чтобы Python мог эффективно работать на многоядерных процессорах.
Самая громкая новость: сборка Python без GIL (free-threaded) теперь официально поддерживается. Это больше не экспериментальная фича. Что это значит на практике?
multiprocessing
.Разработчики ядра уверены в выбранном пути, а сообщество активно работает над адаптацией библиотек.
Еще один мощный удар по ограничениям GIL. Возможность запускать несколько изолированных интерпретаторов в одном процессе существует в C-API уже лет 20, но только сейчас она стала доступна напрямую из Python через новый модуль concurrent.interpreters
.
[!NOTE] Думайте об этом так: изоляция как у
multiprocessing
, но эффективность как уthreading
.
Это открывает дорогу к двум вещам:
Конечно, есть и ограничения:
memoryview
).Тем не менее, для CPU-емких задач это революционная возможность. В комплекте идет и новый concurrent.futures.InterpreterPoolExecutor
.
В CPython добавили новый тип внутреннего интерпретатора. Вместо гигантского switch-case
для опкодов он использует хвостовые вызовы между небольшими C-функциями. На новых компиляторах (пока что Clang 19+) это дает заметный прирост производительности — в среднем 3-5% на стандартных бенчмарках.
[!WARNING] Это не оптимизация хвостовых вызовов в вашем Python-коде (рекурсия по-прежнему не оптимизируется). Это внутреннее изменение CPython.
Официальные сборки для macOS и Windows теперь включают экспериментальный JIT-компилятор. Включается он переменной окружения PYTHON_JIT=1
. Пока это очень ранняя стадия, и прирост производительности нестабилен (от -10% до +20%), но это явный знак, куда движется CPython.
Кроме производительности, есть и несколько очень интересных нововведений, с которыми столкнется каждый.
Это обобщение f-строк. Если f-строка сразу вычисляется в str
, то t-строка, с префиксом t
, вычисляется в специальный объект string.templatelib.Template
.
from string.templatelib import Template, Interpolation
name = "World"
template: Template = t"Hello {name}"
Зачем это нужно? Этот Template
объект хранит структуру строки: где статические части, а где подстановки. Это позволяет писать "умные" обработчики шаблонов. Самый очевидный пример — безопасная генерация HTML.
# Представим, что у нас есть такая функция
def html(template: Template) -> str:
# ... логика экранирования ...
...
evil = "<script>alert('evil')</script>"
template = t"<p>{evil}</p>"
# html() видит, что evil - это подстановка, и экранирует ее
assert html(template) == "<p><script>alert('evil')</script></p>"
Сравните с f-строкой, которая бы просто подставила вредоносный код. T-строки открывают двери для безопасных SQL-запросов, генерации CSS, легковесных DSL и многого другого прямо "из коробки".
Аннотации типов теперь не вычисляются в момент определения функции или класса. Они сохраняются в специальном виде и вычисляются только по требованию (например, при вызове get_annotations
).
Что это дает?
def func(arg: Node) -> Node:
без оборачивания Node
в строки, даже если класс Node
определен ниже.from __future__ import annotations
: Этот импорт теперь считается устаревшим и в будущем будет удален.Для интроспекции аннотаций появился новый модуль annotationlib
с функцией get_annotations()
, которая позволяет получать аннотации в разных форматах (вычисленные значения, строковые представления и т.д.).
Небольшое, но приятное улучшение. Если вы ловите несколько исключений и не используете as
, скобки теперь можно опустить.
# Раньше было обязательно
try:
...
except (TimeoutError, ConnectionRefusedError):
...
# Теперь можно так
try:
...
except TimeoutError, ConnectionRefusedError:
...
Это работает и для except*
.
В Python добавили поддержку высокоэффективного и быстрого алгоритма сжатия Zstandard. Появился новый пакет compression
, который объединяет модули для работы со сжатием, и внутри него — compression.zstd
.
from compression import zstd
import math
data = str(math.pi).encode() * 20
compressed = zstd.compress(data)
Поддержка zstd также добавлена в tarfile
, zipfile
и shutil
.
Появился новый интерфейс, который позволяет отладчикам и профилировщикам безопасно подключаться к уже запущенному Python-процессу без лишних накладных расходов.
Практическое применение, которое оценят многие: теперь pdb
можно подключить к работающему процессу по его PID.
python -m pdb -p 12345
Это невероятно мощный инструмент для отладки "зависших" или ведущих себя странно приложений в продакшене или на стейджинге.
Интерпретатор стал еще умнее и теперь подсказывает при опечатках в ключевых словах.
whille True:
pass
# SyntaxError: invalid syntax. Did you mean 'while'?
async def foo():
awaid fetch_data()
# SyntaxError: invalid syntax. Did you mean 'await'?
map(strict=True)
: Встроенная функция map()
получила флаг strict
(как у zip()
), который проверяет, что все итерируемые объекты имеют одинаковую длину.pathlib.Path
: Добавлены методы copy()
, copy_into()
, move()
и move_into()
для рекурсивного копирования и перемещения файлов/директорий.os.path.realpath(strict=os.path.ALLOW_MISSING)
: Новый режим для realpath
, который разрешает отсутствующие компоненты в пути, но все равно разрешает симлинки.from __future__ import annotations
: Официально устарел.asyncio
полиси: Вся система политик (get_event_loop_policy
, set_event_loop_policy
) устарела в пользу asyncio.run(loop_factory=...)
.asyncio.get_event_loop()
: Неявное создание цикла событий удалено. Если цикл не запущен, вызов этой функции теперь вызовет RuntimeError
.ast
: ast.Num
, ast.Str
, ast.Bytes
и ast.NameConstant
окончательно удалены. Используйте ast.Constant
. Если вы писали свои визиторы AST, вам придется их обновить.codecs.open()
: Устарел. Используйте встроенный open()
.Язык делает решительный шаг в мир высокопроизводительных вычислений и настоящего параллелизма. Официальная поддержка free-threaded режима, множественные интерпретаторы и экспериментальный JIT — все это кирпичики в фундаменте будущего Python, где он сможет на равных конкурировать с другими языками в CPU-bound задачах.