Как в Python управляются переменные и память? Есть ли у него стек и куча и какой алгоритм используется для управления памятью? Имея это знание, есть ли какие-либо рекомендации по управлению памятью для обработки больших чисел / данных?
python
memory
memory-management
Мэтт Алкок
источник
источник
Ответы:
Автоматически! Нет, на самом деле вы просто создаете объект, а виртуальная машина Python обрабатывает необходимую память и место, где она должна быть размещена в структуре памяти.
Когда мы говорим об этом,
CPython
он использует частную кучу для хранения объектов. Из документации CPython C API :Освобождение памяти в основном выполняется путем подсчета ссылок . То есть виртуальная машина Python ведет внутренний журнал, в котором указывается, сколько ссылок ссылается на объект, и автоматически собирает мусор, когда на него больше нет ссылок. Кроме того, существует механизм разрыва циклических ссылок (с которым счетчик ссылок не может справиться) путем обнаружения недостижимых «островков» объектов, что в некоторой степени противоположно традиционным алгоритмам сборки мусора, которые пытаются найти все доступные объекты.
ПРИМЕЧАНИЕ. Помните, что эта информация носит
CPython
конкретный характер. Другие реализации питона, такие какpypy
,iron python
,jython
и другие могут отличаться друг от друга и от CPythonкогда речь заходит об их специфике реализации. Чтобы лучше понять это, можно понять, что существует разница между семантикой (языком) Python и базовой реализацией.Сейчас я не могу об этом говорить, но я уверен, что NumPy (самая популярная библиотека Python для обработки чисел) имеет механизмы, которые изящно обрабатывают потребление памяти.
Если вы хотите узнать больше о внутреннем устройстве Python, взгляните на эти ресурсы:
источник
Python не имеет какой - либо подобное.
Python - это язык, и он не определяет, как именно реализации должны достигать семантики, определенной Python языком.
Каждая реализация (CPython, PyPy, IronPython, Stackless , Jython ...) может делать свои собственные вещи!
В C Python все объекты находятся в куче:
Виртуальная машина 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 : Источник
источник