Как работает стек 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. Исходный код компилируется в байт-код, который выполняется на этой виртуальной машине на основе стека.