В CPython ускорили reference counting
В CPython основа управления памятью это reference counting: у каждого объекта есть счётчик ссылок, и при каждом “взял/отпустил” он инкрементится/декрементится. В цикле, который крутится очень много раз, это превращается в ощутимый оверхед и лишние записи в память (да, даже чтение переменной = запись из-за refcount).
С Python 3.14 добавили новую байткод-инструкцию: LOAD_FAST_BORROW.
Что меняется:
- раньше LOAD_FAST грузил локалку и поднимал refcount
- теперь LOAD_FAST_BORROW грузит локалку без инкремента
- есть ещё “склеенные” опкоды типа LOAD_FAST_BORROW_LOAD_FAST_BORROW (две загрузки за один opcode)
Зачем это нужно:
- меньше дергаем refcount в hot-path
- меньше мусора в CPU cache
- быстрее на циклах, где ты постоянно читаешь одни и те же локальные переменные
Но оптимизация включается не всегда. CPython применяет её только когда может доказать безопасность через статический анализ времени жизни (по CFG):
- значение используется “локально” и быстро потребляется
- не утекает в heap/генераторы/кадры
- источник не перезаписывается так, чтобы сломать “borrow”
Это похоже на упрощённые Rust lifetimes/borrowing, только на уровне байткода.
👉 @PythonPortal
Post #5384
9.13K
- 👍 20
- ❤ 9