Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

Ответ 2

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 return value is pushed on stack
             24 RETURN_VALUE               # Return TOS to caller (result of f)

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

1: Источник