Есть ли у Python стек / куча и как управляется память?

92

Как в Python управляются переменные и память? Есть ли у него стек и куча и какой алгоритм используется для управления памятью? Имея это знание, есть ли какие-либо рекомендации по управлению памятью для обработки больших чисел / данных?

Мэтт Алкок
источник
1
Возможно, вы захотите прочитать следующие два: foobarnbaz.com/2012/07/08/understanding-python-variables docs.python.org/2/c-api/memory.html
user1690293
1
Есть ли какая-то конкретная проблема с управлением переменными / памятью Python, с которой у вас возникла проблема, и которую тривиально не обнаруживают в документации Python и / или при поиске в Google?
Мартин Джеймс

Ответы:

112

Как переменные и память управляются в Python.

Автоматически! Нет, на самом деле вы просто создаете объект, а виртуальная машина Python обрабатывает необходимую память и место, где она должна быть размещена в структуре памяти.

Есть ли у него стек и куча и какой алгоритм используется для управления памятью?

Когда мы говорим об этом, CPythonон использует частную кучу для хранения объектов. Из документации CPython C API :

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

Освобождение памяти в основном выполняется путем подсчета ссылок . То есть виртуальная машина Python ведет внутренний журнал, в котором указывается, сколько ссылок ссылается на объект, и автоматически собирает мусор, когда на него больше нет ссылок. Кроме того, существует механизм разрыва циклических ссылок (с которым счетчик ссылок не может справиться) путем обнаружения недостижимых «островков» объектов, что в некоторой степени противоположно традиционным алгоритмам сборки мусора, которые пытаются найти все доступные объекты.

ПРИМЕЧАНИЕ. Помните, что эта информация носитCPythonконкретный характер. Другие реализации питона, такие какpypy,iron python,jythonи другие могут отличаться друг от друга и от CPythonкогда речь заходит об их специфике реализации. Чтобы лучше понять это, можно понять, что существует разница между семантикой (языком) Python и базовой реализацией.

Имея это знание, есть ли какие-либо рекомендации по управлению памятью для обработки больших чисел / данных?

Сейчас я не могу об этом говорить, но я уверен, что NumPy (самая популярная библиотека Python для обработки чисел) имеет механизмы, которые изящно обрабатывают потребление памяти.

Если вы хотите узнать больше о внутреннем устройстве Python, взгляните на эти ресурсы:

NlightNFotis
источник
5
Хорошо, что вы подчеркиваете различие между Python и CPython;)
phant0m
1
Обратите внимание, что фактические переменные локальных переменных будут храниться в эквиваленте кадра стека.
Marcin
1
Python - это не Java; у него нет виртуальной машины; у него есть переводчик. Указывать на это может показаться педантичным, но это две разные парадигмы, и разница имеет важное значение для того, как код компилируется и запускается. stackoverflow.com/questions/441824/...
Apollo2020
49

Python не имеет какой - либо подобное.

Python - это язык, и он не определяет, как именно реализации должны достигать семантики, определенной Python языком.

Каждая реализация (CPython, PyPy, IronPython, Stackless , Jython ...) может делать свои собственные вещи!

В C Python все объекты находятся в куче:

Управление памятью в Python включает в себя частную кучу, содержащую все объекты и структуры данных Python. 1

Виртуальная машина CPython основана на стеке:

>>> def g():
    x = 1
    y = 2
    return f(x, y)

>>> import dis
>>> dis.dis(g)
  2           0 LOAD_CONST           1 (1) # Push 1 onto the stack
              3 STORE_FAST           0 (x) # Stores top of stack into local var x

  3           6 LOAD_CONST           2 (2) # Push 2 onto stack
              9 STORE_FAST           1 (y) # Store TOS into local var y

  4          12 LOAD_GLOBAL          0 (f) # Push f onto stack
             15 LOAD_FAST            0 (x) # Push x onto stack
             18 LOAD_FAST            1 (y) # Push y onto stack
             21 CALL_FUNCTION        2     # Execute function with 2 
                                           # f's return value is pushed on stack
             24 RETURN_VALUE               # Return TOS to caller (result of f)

Имейте в виду, что это специфично для CPython. Однако стек не содержит фактических значений, он сохраняет ссылки на эти объекты.

1 : Источник

phant0m
источник