Как работает стек Python при работе с кортежами / списками?

Я видел в документации Python, что BUILD_TUPLE Инструкция "Создает кортеж, потребляющий количество элементов из стека, и помещает полученный кортеж в стек".

Это действительно толкает сам кортеж? Что, если кортеж содержит большое количество элементов? Как он размещается в стеке?

2 ответа

Далее к ответу @juanpa.arrivillaga и мне, играя с dis модуль впервые…

может быть поучительно разобрать тривиальную функцию:

def foo(a, b, c):
  return (a, b, c)

что приводит к:

  2           0 LOAD_FAST                0 (a)
              2 LOAD_FAST                1 (b)
              4 LOAD_FAST                2 (c)
              6 BUILD_TUPLE              3
              8 RETURN_VALUE

другими словами: мы проверяем, чтобы в стеке были правильные значения параметров в верхней части, а затем извлекаем их все и заменяем их (ссылкой на) одиночным кортежем.

Вот как традиционно работают стековые машины, и я считаю, что CPython (по крайней мере, частично) смоделирован, например, что означает, что Python основан на стеке?

Этот ответ относится конкретно к CPython, но все объекты CPython живут в частной куче.

Управление памятью в Python включает в себя приватную кучу, содержащую все объекты Python и структуры данных. Управление этой частной кучей обеспечивается внутренним менеджером памяти Python. Менеджер памяти Python имеет различные компоненты, которые имеют дело с различными аспектами динамического управления хранением, такими как совместное использование, сегментация, предварительное распределение или кэширование.

На самом низком уровне необработанный распределитель памяти гарантирует, что в частной куче достаточно места для хранения всех данных, связанных с Python, путем взаимодействия с диспетчером памяти операционной системы. Вдобавок к необработанному распределителю памяти, несколько объектно-ориентированных распределителей работают в одной и той же куче и реализуют различные политики управления памятью, адаптированные к особенностям каждого типа объектов. Например, целочисленные объекты управляются в куче иначе, чем строки, кортежи или словари, потому что целые числа подразумевают различные требования к хранилищу и компромисс между скоростью и пространством. Менеджер памяти Python, таким образом, делегирует часть работы объектно-ориентированным распределителям, но гарантирует, что последние работают в пределах приватной кучи.

Обратите внимание, что все в Python является объектом. Единственное, что попадает в стек интерпретатора - это указатель PyObject. Стек здесь является деталью реализации среды выполнения CPython. Исходный код компилируется в байт-код, который выполняется на этой виртуальной машине на основе стека.

Другие вопросы по тегам