Команда розробників Python представила версію 3.15 — щорічне оновлення мови. За інформацією Phoronix, головні зміни стосуються швидкості старту програм, обробки тексту та засобів діагностики, а експериментальний JIT-компілятор нарешті почав демонструвати помітний приріст швидкодії.

Головне про Python 3.15 одним поглядом

  • Експериментальний JIT — приріст швидкодії на 7–8% на Linux x86-64 та на 11–12% на macOS з AArch64
  • Ліниві імпорти (PEP 810) — явне відкладене завантаження модулів для пришвидшення старту
  • UTF-8 за замовчуванням (PEP 686) — однакове кодування тексту незалежно від операційної системи
  • frozendict — новий вбудований тип незмінного словника
  • sentinel — стандартизовані маркерні значення
  • пакет profiling та інструмент Tachyon — профілювання запущених процесів без перезапуску
  • frame pointers — надійніша трасировка стеку, сумісна з eBPF

Ліниві імпорти пришвидшують запуск

Донедавна Python завантажував усі імпортовані модулі одразу під час старту програми, навіть якщо вони не використовувалися під час виконання коду. У масштабних проєктах із великою кількістю залежностей це відчутно затягувало запуск. Версія 3.15 вирішує цю проблему завдяки явним лінивим імпортам, описаним у PEP 810.

Нове ключове слово lazy дозволяє відкласти завантаження модуля до моменту першого реального звернення до нього. Наприклад, конструкція lazy import json лише фіксує намір використати модуль, а завантаження відбувається тільки тоді, коли код справді до нього звертається. Для консольних утиліт та об'ємних сервісів це дає змогу скоротити час запуску, не змінюючи архітектуру застосунку.

UTF-8 став стандартом

Згідно з PEP 686, кодування UTF-8 тепер використовується за замовчуванням для роботи з текстом. Це мінімізує ймовірність появи нечитабельних символів при роботі з текстовими файлами, особливо коли проєкт переносять між Linux, Windows та macOS. Розробникам більше не доведеться щоразу прописувати encoding="utf-8" у виклику open().

Два додаткові вбудовані типи

Тип frozendict являє собою незмінний словник: після створення його вміст змінити не можна, а порядок додавання елементів зберігається. Якщо всі ключі та значення піддаються хешуванню, то й сам frozendict можна хешувати.

Тип sentinel пропонує уніфікований спосіб створювати унікальні маркерні значення. Зазвичай вони потрібні в API, щоб відрізнити ситуацію, коли аргумент не передали взагалі, від випадку, коли йому явно присвоїли значення None.

JIT лишається експериментальним, та вже дає відчутний приріст

Статус JIT-компілятора в Python досі офіційно експериментальний, проте у версії 3.15 його продуктивність суттєво зросла. За даними Linuxiac, на Linux x86-64 середній геометричний приріст порівняно зі звичайним інтерпретатором становить 7–8%. На macOS з архітектурою AArch64 JIT випереджає інтерпретатор із хвостовими викликами на 11–12%.

Новий інструмент профілювання Tachyon

У цьому релізі з'явився окремий пакет profiling, що об'єднує інструменти для профілювання під єдиним інтерфейсом. До нього входить Tachyon — статистичний семплювальний профайлер із високою частотою опитування та мінімальними накладними витратами.

  • Підключається до вже запущеного процесу Python без перезапуску й без змін у коді
  • Підтримує кілька режимів вимірювання: за часом CPU, за реальним (wall-clock) часом та за часом утримання глобального блокування інтерпретатора (GIL)
  • Будує flame graph та інші візуалізації для виявлення вузьких місць у продуктивності

Зручніше для Linux-адміністраторів та системних інженерів

CPython тепер за замовчуванням активує frame pointers на платформах, що це підтримують. Завдяки цьому трасування нативного стеку стає надійнішим, а сумісність із системними інструментами профілювання й налагодження — зокрема тими, що базуються на eBPF — покращується.

Крім того, розширено підтримку збірок без GIL (free-threaded): з'явилася підтримка стабільного ABI для таких збірок, а також низка покращень C API, що полегшує роботу авторам розширень.

Інші зміни

  • Покращені повідомлення про помилки та більше кольору у виводі командного рядка
  • Нові можливості типізації
  • Покращення стандартної бібліотеки та C API
  • Офіційні 64-бітні збірки для Windows тепер використовують інтерпретатор із хвостовими викликами
  • Інсталятори для macOS за замовчуванням включають підтримку free-threading

Бонус: гра про нововведення Python

Розробник Баррі Варшо (Barry Warsaw) створив whatsnewt — текстовий квест для терміналу з 18 головоломками, побудованими на нововведеннях версії 3.15. Запустити гру найпростіше командою uvx --python 3.15 whatsnewt.

Де завантажити й що почитати

Python 3.15 вже доступний для завантаження на Python.org. Докладніше про зміни можна дізнатися з офіційного анонсу та документації What's New in Python 3.15.

Джерело: Highload.tech