Python 3.12: Кардинальное изменение производительности и экономичности

Python 3.12: Кардинальное изменение производительности и экономичности

Ожидается, что Python 3.12, следующая версия языка программирования Python, внесёт в него значительные оптимизации и улучшения с акцентом на повышение скорости, производительности и стабильности интерпретатора. Эта новая версия разработана для того, чтобы сделать Python более мощным и эффективным инструментом для разработчиков, особенно для работы с большими и сложными приложениями.

Улучшенный многопоточный параллелизм

Python предпринимает шаги по улучшению многопоточного параллелизма путём перехода от единой глобальной блокировки интерпретатора для каждого процесса к глобальной блокировке интерпретатора для каждого суб-интерпретатора. С помощью PEP 684 и PEP 554 суб-интерпретаторы могут быть созданы на Python, что обеспечивает подлинный многопоточный параллелизм.

Расширение специализации

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

Компактные объектные структуры

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

Обновлённый оптимизатор трассировки

Основным улучшением в версии Python 3.12 является оптимизатор трассировки. В отличие от предыдущей версии, где акцент делался на замене отдельных кодов операций более быстрыми, зависящими от контекста, теперь фокус сместился в сторону оптимизации последовательностей из нескольких кодов операций. Чтобы достичь этого, многие коды операций высокого уровня будут заменены кодами операций более низкого уровня, которые предоставляют большие возможности оптимизации. Кроме того, эти упрощённые коды операций приблизят интерпретатор к набору инструкций, которые могут быть преобразованы в машинный код, как в CPython, так и в JIT-проектах сторонних разработчиков.

Генерация цикла декларативного интерпретатора

Цикл интерпретатора будет сгенерирован на основе декларативного описания, что уменьшит вероятность ошибок, вызванных несинхронизацией цикла интерпретатора с другими функциями. Кроме того, это изменение позволит поэкспериментировать со значительными изменениями в цикле интерпретатора.

Стабилизированный API

Для дальнейшего повышения качества кодовой базы CPython команда разработчиков предпринимает следующие действия:

Упрощение обслуживания и тестирования компилятора:

Команда работает над уменьшением зависимости между различными этапами компиляции, упрощая обслуживание и тестирование компилятора.

Расширение охвата кода:

Набор тестов CPython на уровне C будет отслеживаться и улучшаться для увеличения охвата кода. Расширение пакета Pyperformance Suite: Пакет сравнительного анализа pyperformance будет улучшен, чтобы включать более реалистичные рабочие нагрузки в реальном мире.

Помощь в решении проблем, связанных с производительностью:

Команда обеспечит поддержку по вопросам CPython и PR, особенно для тех, которые связаны с производительностью.

Расширение стандартных результатов бенчмаркинга:

Набор стандартных машин для бенчмаркинга и результатов будет расширен за счёт включения macOS и Windows.

Сотрудничество с основными пользователями Python:

Команда разработчиков будет работать с крупными проектами, использующими внутренние компоненты Python, чтобы помочь им приспособиться к изменениям в интерпретаторе CPython.

Удалённые и устаревшие функции

С выпуском Python 3.12, пакет distutils, наконец, будет удалён. Согласно PEP 632, distutils был помечен как устаревший в Python 3.10 и больше не будет частью стандартной библиотеки в Python 3.12. Импорт из distutils приведёт к ошибке, так как обратная совместимость предлагаться не будет

Distutils когда-то был предпочтительным модулем для управления пакетами в Python, но его ограничения привели к появлению setuptools, который теперь стал рекомендуемым решением в соответствии с руководством пользователя по упаковке Python. Setuptools по-прежнему использует некоторые функциональные возможности distutils, но он интегрировал копию последнего и больше не зависит от стандартной библиотеки. Pip также уже некоторое время заменяет distutils на setuptools, поэтому имеет смысл удалить устаревший модуль distutils в Python 3.12.

Кроме того, Python 3.12 также удалит элементы wstr и wstr_length из Unicode, как указано в PEP 623. Это изменение соответствует устареванию некоторых API-интерфейсов Unicode в PEP 393. Удаление этих элементов приведёт к уменьшению размера объекта на 8 или 16 байт на 64-разрядных платформах.

Улучшенные отчёты об ошибках в Python 3.12

В новой версии Python 3.12, будут добавлены улучшенные отчёты об ошибках, в частности, для NameError, вызванного на верхнем уровне для модулей в стандартной библиотеке. Интерпретатор также теперь будет предоставлять предложения в отчётах об ошибке.

class A: def __init__(self): self.blech = 1 def foo(self): somethin = blech
>>> A().foo() File "<stdin>", line 1 somethin = blech ^^^^^ NameError: name 'blech' is not defined. Did you mean: 'self.blech'?

Устаревшие функции в Python 3.12

В рамках выпуска Python 3.12 ряд функций модуля unittest, которые считались устаревшими в более ранних версиях (в основном v3.1 и 3.2), теперь будут удалены. Удаления будут переданы функции:

  • Many TestCase method aliases, such as failUnless, failIf, failUnlessEqual, failIfEqual, failUnlessAlmostEqual, failIfAlmostEqual, failUnlessRaises, assert_, assertEquals, assertNotEquals, assertAlmostEquals, assertNotAlmostEquals, assertRegexpMatches, assertRaisesRegexp, and assertNotRegexpMatches
  • The TestCase method assertDictContainsSubset
  • The use_load_tests parameter in TestLoader.loadTestsFromModule
  • The _TextTestResult alias of TextTestResult

Изменения в Python API

  • Более строгие правила теперь применяются к числовым ссылкам на группы и именам групп в регулярных выражениях. В качестве числовой ссылки теперь принимается только последовательность цифр ASCII. Название группы в байтовых шаблонах и строках замены теперь может содержать только буквы ASCII, цифры и подчеркивание. (Внесено Serhiy Storchaka в gh-91760.)
  • Удалена функция randrange(), устаревшая с Python 3.10. Ранее randrange(10.0) без потерь преобразовывался в randrange(10). Теперь это вызывает ошибку TypeError. Кроме того, исключение, возникающее для нецелых значений, таких как randrange(10.5) или randrange('10'), было изменено с ValueError на TypeError. Это также предотвращает ошибки, при которых randrange(1e25) автоматически выбирал бы из большего диапазона, чем randrange(10 ** 25). (Первоначально предложено Serhiy Storchaka gh-86388.)
  • argparse.ArgumentParser изменил кодировку и обработчик ошибок для чтения аргументов из файла (например, параметр fromfile_prefix_chars) с кодировки текста по умолчанию (например, locale.getpreferredencoding(False)) на кодировку файловой системы и обработчик ошибок. Файлы аргументов должны быть закодированы в UTF-8 вместо кодовой страницы ANSI в Windows.
  • Удален модуль smtpd на основе asyncore, который устарел в Python 3.4.7 и 3.5.4. Рекомендуемой заменой является модуль aiosmtpd PyPI на основе asyncio.
  • shlex.split(): Передача None для аргумента s теперь вызывает исключение, а не чтение sys.stdin. Эта функция устарела в Python 3.9. (внесено Виктором Стиннером в gh-94352.)
  • Модуль ОС больше не принимает байтоподобные пути, такие как типы bytearray и memoryview: для строк bytes принимается только точный тип bytes. (Внесено Victor Stinner в gh-98393.)
  • syslog.openlog() и syslog.closelog() теперь терпят неудачу, если используются в субинтерпретаторах. syslog.syslog() по-прежнему может использоваться в субинтерпретаторах, но теперь только в том случае, если syslog.openlog() уже был вызван в главном интерпретаторе. Эти новые ограничения не распространяются на основной интерпретатор, поэтому это может затронуть только очень небольшой круг пользователей. Это изменение помогает с изоляцией интерпретатора. Кроме того, syslog - это оболочка для глобальных ресурсов процесса, которыми лучше всего управлять из основного интерпретатора. (Внесено Dong-hee Na в gh-99127.)

Другие усовершенствования и дополнения

Хотя невозможно поделиться всеми изменениями в Python 3.12, вот краткий обзор некоторых неупомянутых улучшений и изменений:

  • Введение os.path.injunction() в модуль стандартной библиотеки os, позволяющий пользователям проверять, является ли путь перекрёстком
  • Новый метод pathlib.Path.walk() для обхода деревьев каталогов, аналогичный os.walk()
  • Удаление нескольких модулей и API, ранее не рекомендованных в предыдущих версиях Python

Для получения полного списка всех изменений, запланированных к выпуску Python 3.12, обратитесь к официальной документации:

Заключение

Версия Python 3.12 будет включать в себя несколько улучшений и изменений в языке. Модуль distutils был помечен как устаревший и будет удалён в выпуске Python 3.12. Вместо этого рекомендуемым модулем для управления пакетами станет setuptools. Кроме того, элементы str и str_length будут удалены из Unicode.

Отчёты об ошибках также будут улучшены, особенно с помощью NameErrors на верхнем уровне для стандартных библиотечных модулей. В модуле unittest будут удалены несколько устаревших функций, включая псевдонимы методов и параметры.

Другие изменения включают введение элемента os.path.injunction() для проверки путей соединения и метода pathlib.Path.walk() для обхода деревьев каталогов. Несколько модулей и API-интерфейсов, ранее не рекомендованных в более ранних версиях, также будут удалены.

Статья была взята из этого источника:

2
Начать дискуссию