Недавно в Python quietly появился апдейт, который уменьшает накладные расходы reference counting в горячих местах. Ключевая идея — заимствование ссылок без увеличения счётчика (`LOAD_FAST_BORROW`).
Вот минимальный пример на Python:
def advance(vx, vy, steps):
x, y = 1, 1
for _ in range(steps):
x *= vx
y *= vy
return x, y
На первый взгляд — обычный цикл. Но раньше CPython на каждой итерации увеличивал и уменьшал refcount для
vx и vy.Если посмотреть байткод:
Python 3.13
LOAD_FAST vx
LOAD_FAST x
BINARY_OP *=
Python 3.15
LOAD_FAST_BORROW vx
LOAD_FAST_BORROW x
BINARY_OP *=
Разница тонкая, но важная:
LOAD_FAST → увеличивает reference countLOAD_FAST_BORROW → берёт ссылку временно, без инкрементаЭто возможно только если интерпретатор доказывает, что объект:
✔️ используется локально
✔️ не переопределяется
✔️ не «утекает» наружу
По сути, CPython делает упрощённый lifetime-анализ — очень похоже на borrow-идею из Rust, только на уровне байткода.
Итог: меньше операций с памятью, меньше давления на CPU cache и ускорение циклов без изменения Python-кода.
🔗 Если хочется увидеть полный байткод-дифф и внутреннюю логику оптимизации — дальше всё подробно разобрано в статье.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст