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

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

2 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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: источник

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