Начиная с Python 3.11 обычный
obj.x часто вообще не делает lookup по словарю. После прогрева интерпретатор специализирует LOAD_ATTR, а значение читается почти напрямую из inline storage объекта. Но достаточно выполнить:
`obj.__dict__`
или:
`vars(obj)`
а в некоторых случаях даже:
`copy.copy(obj)`
— и
__dict__ материализуется. После этого объект теряет быстрый специализированный путь на оставшееся время жизни. На CPython 3.14.6 в тесте на M3:
обычный объект → 33.0 ms после чтения __dict__ → 50.6 msВ free-threaded сборке разрыв ещё больше:
34.0 ms → 59.4 ms.
Интересная деталь:
__slots__ сам по себе почти не ускоряет обычный attribute access. Его преимущество здесь в другом — у объекта нет __dict__, значит его невозможно случайно материализовать и сбить оптимизацию.Очень неочевидная причина, почему
vars() или copy.copy() внутри hot path могут неожиданно ударить по производительности.https://deadlovelll.github.io/2026-09-05-reading-dict-deoptimizes-attribute-access/
