TGViewer
Python Portal Python Portal @pythonportal · 50.1K subscribers
Post #5084 8.09K
«Это же Python.. что ни сделай - всё в итоге аллоцируется».


Насколько это правда?

Разработчик внёс правку в CPython, чтобы логировались все аллокации объектов int. Затем запустил простой цикл сложения чисел 100 тысяч раз. В терминал прилетело 101006 сообщений.

Почему так много?

Во внутренних механизмах CPython каждое целое число представлено объектом PyLongObject в куче. И маленькие тоже.

Большинство VM используют tagged pointers, чтобы обойтись без лишних аллокаций. Даже Smalltalk в 80-х уже умел это. Python же идёт по тяжёлому пути: каждая аллокация тормозит работу, а редкий случай больших чисел ухудшает производительность самого частого кейса — простых интов.

Допущение: в тесте использовался print, который тоже может порождать новые ints. Разработчик убрал print. Количество аллокаций резко снизилось.

Куда делись остальные ~100k?

Смотрим функцию сложения ints. Если оба операнда меньше 2^30, их значения просто достаются и складываются напрямую. Тип stwodigits так и называется потому, что PyLongObject хранит число в основании 2^30 - каждый элемент массива хранит такой разряд.

Дальше вызывается _PyLong_FromSTwoDigits. В зависимости от величины числа - три пути.

Для маленьких чисел есть оптимизация: готовый статический массив маленьких PyLongObject, без аллокаций в куче. Просто возвращается указатель.

Для средних значений подключается другая функция. И вот что важно:

long_alloc тут не используется

Сначала пытается взять объект из freelist

Если нет свободных = создаёт новый

Freelist - типичная техника для переиспользования освобождённых объектов, чтобы лишний раз не трогать аллокатор.

В long_dealloc объект аккуратно возвращается в этот список.

Разработчик перенёс отладочный вывод в _PyLong_FromMedium: стало видно, что приличная часть объектов переиспользуется.

Но даже так накладные расходы огромные. На уровне процессора сложение двух int - одна инструкция ADD, исполняемая за один такт. В Python же вокруг неё целый аттракцион.

Плюс заметно отсутствие довольно старых оптимизаций, известных индустрии десятки лет.

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

И именно такие вещи делают языки вроде Zig привлекательными для разработчиков.

Подробнее с кодом: тык

👉 @PythonPortal
  • 😁 6
  • 🔥 1
  • 🤔 1
More from @pythonportal
  1. Oct 12, 2026Можно буквально ввести предложение и посмотреть, как Transformer обрабатывает его. Этот ин…
  2. Oct 11, 2026«Graph Theory with Applications» — бесплатный учебник, который даёт всестороннее введение…
  3. Oct 11, 2026Разбор собеседований по проектированию систем, разделённый на 28 глав. Рассматриваются мас…
  4. Oct 11, 2026Вышла долгожданная новая версия Python — 3.15 🐍 В неё вошли 5643 коммита от тысячи разраб…
  5. Oct 10, 2026Сейчас в сфере ИИ есть два карьерных пути: Первый — разработчик, который умеет создавать п…
  6. Oct 10, 2026Скачайте 10 книг по Python БЕСПЛАТНО: 1. Think Python — O’Reilly https://t.co/X7y3pX68IW 2…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →