Выпуск языка программирования Python 3.15
После года разработки опубликован значительный выпуск языка программирования Python 3.15. Среди изменений: включение по умолчанию UTF-8, отложенная загрузка модулей, оптимизация экспериментального JIT-компилятора, типы frozendict и sentinel, файлы конфигурации для инициализации при запуске, расширение возможностей для профилирования, сборка в режиме "-fno-omit-frame-pointer", встроенная текстовая игра "whatsnewt". Новая ветка будет поддерживаться в течение полутора лет, после чего ещё три с половиной года для неё будут формироваться исправления с устранением уязвимостей.
Среди новшеств, добавленных в Python 3.15 (1, 2, 3):
- Модернизирован экспериментальный JIT-компилятор, который теперь позволяет добиться в среднем ускорения на 11-12% на платформе macOS AArch64 и на 7-8% на платформе x86_64 Linux в тестах pyperformance по сравнению со стандартным интерпретатором. При этом в отдельных тестах при включении JIT изменение производительности варьируется от ускорения на более чем 100%, до замедления на 15%. Помимо оптимизации производительности и улучшения генерации машинного кода в новой версии в JIT переработан механизм трассировки, который теперь учитывает реальные последовательности выполнения кода, а не только их прогнозирует, что позволило значительно расширить поддержку операций байткода. Осуществлён переход на ветку LLVM 21. В генерируемом коде некоторые операции со стеком заменены на работу с использованием регистров CPU.
Добавлена поддержка раскрутки стека (unwinding) для GDB и GNU backtrace().
- В качестве кодировки по умолчанию задействована UTF-8, независимо от системы в которой выполняется код. Все операции ввода/вывода если явно не указана кодировка теперь обрабатывают текстовые данные как последовательности UTF-8. Для использования параметров текущей локали или иной кодировки следует указывать аргумент "encoding" (например, "open('test.txt', encoding='locale')"). Отключить режим UTF-8 на уровне интерпретатора можно через опцию командной строки "-X utf8=0" или переменную окружения "PYTHONUTF8=0".
- Добавлено ключевое слово "lazy" для отложенной загрузки модулей, используя которое можно ускорить запуск приложений с большим числом зависимостей. При отложенной загрузке модули загружаются непосредственно перед первым обращением к импортируемым именам в коде. До фактической загрузки для модулей создаётся легковесный прокси-объект "types.LazyImportType", отслеживающий обращение к модулям. В случае проблем с загрузкой модуля, например, если модуль не найден, исключение генерируется в момент попытки первого использования, а не во время импорта. Для принудительного отключения отложенной загрузки предусмотрена опция командной строки "-X lazy_imports" и переменная окружения PYTHON_LAZY_IMPORTS, а также функции sys.set_lazy_imports() и sys.get_lazy_imports(). Для выборочной фильтрации модулей, к которым применяется отложенная загрузка, добавлена функция sys.set_lazy_imports_filter().
[[RPE]]
lazy import json
lazy from pathlib import Path
print("Starting up...") # будет запущено не дожидаясь импорта json и pathlib.
data = json.loads('{"key": "value"}') # перед вызовом будет импортирован модуль json
p = Path(".") # перед вызовом будет импортирован модуль pathlib
[[/RPE]]
- Добавлен встроенный тип sentinel для создания уникальных строковых объектов, значения которых не повторяются, при копировании сохраняют идентичность и поддерживают сериализацию.
- Добавлен встроенный тип frozendict, позволяющий создавать неизменяемые словари, которые можно инициализировать набором значений в момент создания объектов, но нельзя дополнять и изменять в процессе работы. Объекты с типом frozendict сохраняют порядок вставки элементов и могут хэшироваться для использования в качестве ключей в словарях.
- Добавлена возможность распаковки списочных включений (compreh...
https://opennet.ru/66438/
https://opennet.me/66438/
Post #6931
24