Долгожданный релиз Python 3.11 Python

Долгожданный релиз Python 3.11

24 октября 2022 года вышла новая версия Python за номером 3.11. Что нового нас ожидает?

Производительность

В последних версиях Python очень много внимания уделялось самому слабому месту языка, а именно низкой производительности, суровой плате за динамическую типизацию и использование интерпретатора. Благодаря проекту faster CPython, основной интерпретатор Python теперь работает на 10-60% быстрее. В этот раз его команда сфокусировалась на двух задачах: ускорении запуска и работы. Теперь CPython запускается на 10-15% быстрее. Это стало возможным благодаря "заморозке" импортов. Еще в версии 3.10 для импорта модуля приходилось выполнять цепочку операций.

Read __pycache__ -> Unmarshal -> Heap allocated code object -> Evaluate

Теперь эти объекты и их байт-код статически распределяются, что предельно упрощает импорт:

Statically allocated code object -> Evaluate

Ускорение работы стало возможным благодаря оптимизации стековых кадров. В новой версии:

  • упрощен процесс создания стековых кадров;
  • пространство кадра переиспользуется в стеке C, что позволяет избежать выделения лишней памяти;
  • из фреймов убрали дополнительную информацию (связанную с отладкой и менеджментом памяти)

"Старые" кадры теперь создаются только по запросам отладчика или интроспективных функций, а для большей части кода объекты кадров вообще не создаются. Это позволило поднять скорость выполнения функций на 3-7%.

Встроенные вызовы функций также оптимизировали. Теперь интерпретатор избегает вызова функции интерпретации С при работе с ними, что является отличной новостью для всех, кто работает с рекурсиями. Так, простые рекурсивные функции теперь работают в 1.7 раз быстрее. Это улучшило общую производительность на 1-3%.

Еще одно новшество — специализированный адаптивный интерпретатор. Несмотря на то, что Python - динамический язык, в коде есть множество фрагментов, где объекты и типы очень редко изменяются. Этот концепт назівается стабильностью типов. Теперь интерпретатор распознает такие места и заменяет ресурсоёмкие операции на более специализированные, кэшированные в байт-коде. CPython специализирует только те участки кода, которые активно используются, а если специализированный участок становится слишком динамичным — деспециализирует его.

Ускорение затронуло и более специализированные моменты. Например, блоки исключений теперь работают моментально, если исключение не брошено. К тому же, блок ловит исключение на 10% быстрее, чем раньше. Оптимизация пространств имен у объектов привела к снижению их размера.

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

Важные изменения

Трассировка вызовов теперь будет еще более подробной. Теперь интерпретатор указывает не просто строку, а конкретное выражение, вызвавшее ошибку.

Traceback (most recent call last):
  File "distance.py", line 11, in <module>
    print(manhattan_distance(p1, p2))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "distance.py", line 6, in manhattan_distance
    return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
                           ^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'

Особо полезна новая тарссировка при работе со вложенными словарями и сложными арифметическими операциями.

Исключения

Добавлена поддержка групп исключений. Для этого созданы два новых типа исключений: BaseExceptionGroup и ExceptionGroup. Достать отдельніе исключения из группы можно с помощью выражения except*. В BaseException добавлен метод add_note(), позволяющий прикрепить к исключению примечание.

Значительно расширены возможности аннотации типов.

Добавлена новая аннотация Self, для обозначения экземпляров класса. Его можно использовать для альтернативных конструкторов и методов __enter__.

Аннотация LiteralString нужна для ограничения передачи функциям строковых аргументов, в которые можно подставить другие строки. Это поможет обезопасить формирование SQL-запросов shell-команд. Аннотация TypeVarTuple аналогична TypeVar, но позволяет использовать произвольное количество типов.

Добавлен декоратор классов, методов и функций @dataclass_transform, при указании которого система проверки статических типов трактует объект, как при использовании декоратора @dataclasses.dataclass. В примере ниже класс CustomerModel при проверке типов будет обработан по аналогии с классом с декоратором @dataclasses.dataclass, т.е. как имеющий метод init, допускающий переменные id и name. При помощи новой функции dataclass_transform можно декорировать классы, метаклассы или функции, чтобы проверки типов воспринимали их, как класс данных.

@typing.dataclass_transform()
def create_model(cls: Type[T]) -> Type[T]:
    cls.__init__ = ...
    cls.__eq__ = ...
    cls.__ne__ = ...
    return cls

# Декоратор create_model теперь можно использовать для создания новых модельных классов:
@create_model
class CustomerModel:
    id: int
    name: str

c = CustomerModel(id=327, name="Eric Idle")

Другие интересные изменения

  • Распаковка коллекций теперь работает с оператором for.
  • В стандартную библиотеку добавлены новые модули: tomllib для парсинга TOML и wsgiref.types - WSGI-специфические типы для проверки статической типизации.
  • Методы класса больше не могут заключать в себе другие дескрипторы. Эта возможность приводила к целой цепочке проблем. Разработчики рекомендуют использовать аттрибут __wrapped__, добавленный в Python 3.10, чтобі избежать проблем.
  • Обновлено множество модулей из стандартной библиотеки. Ознакомиться с другими небольшими изменениями, которые могут повлиять на ваши проекты можно на сайте python.org

Послесловие

Python продолжает стремительно развиваться. В новой версии языка много внимания уделено повышению производительности. Пока что ускорение идет очень неравномерно, и существующие проекты могут практически не ощутить прироста скорости. Но оптимизировав узкие места с учетом нововведений, можно добиться хороших результатов. Будем надеяться, что под эгидой Microsoft Python наконец-то избавится от клейма неповоротливого языка, и планы ускорить CPython в пять раз за четыре года будут реализованы. То, что мы видим в версии 3.11 может быть неплохим началом, но по-настоящему серьезные изменения еще только намечаются.

Практический Python для начинающих
Практический Python для начинающих

Станьте junior Python программистом за 7 месяцев

 7 месяцев

Возможно будет интересно

🏆 Hello, world! Python
Новичок
🏆 Hello, world!

Мы вчера запустили новый www.pylot.me. Должны были в следующую среду, но запустили вчера.

2022-10-04
Как практиковаться в Python? Python
Новичок
Как практиковаться в Python?

Для улучшения качества знаний и повышения уровня программиста, необходим постоянный практикум. Где можно это организовать самостоятельно, и как практиковаться в Python?

2022-10-19
Условные конструкции и сопоставление структурных шаблонов Шпаргалки
Новичок
Условные конструкции и сопоставление структурных шаблонов

Шпаргалка по условным конструкциям и сопоставлению структурных шаблонов

2022-11-09