Как работает стек Python при работе с кортежами / списками? - PullRequest
0 голосов
/ 18 ноября 2018

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

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

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

дальше к ответу @ 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 основан на стеке?

0 голосов
/ 18 ноября 2018

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

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

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

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

...