Управление памятью в Python

Опубликовано: 3 Апреля, 2022

Понимание распределения памяти важно для любого разработчика программного обеспечения, поскольку написание эффективного кода означает написание кода с эффективным использованием памяти. Выделение памяти можно определить как выделение программе блока пространства в памяти компьютера. В Python метод выделения и освобождения памяти является автоматическим, поскольку разработчики Python создали сборщик мусора для Python, чтобы пользователю не приходилось выполнять сборку мусора вручную.

Вывоз мусора

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

Примечание. Дополнительные сведения см. В разделе «Сборка мусора в Python».

Подсчет ссылок

Подсчет ссылок работает, подсчитывая, сколько раз на объект ссылаются другие объекты в системе. Когда ссылки на объект удаляются, счетчик ссылок для объекта уменьшается. Когда счетчик ссылок становится нулевым, объект освобождается.

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

Example:

x = 10

When x = 10 is executed an integer object 10 is created in memory and its reference is assigned to variable x, this is because everything is object in Python.

Let’s verify if it’s true

x = 10
y = x
  
if id(x) == id(y):
    print("x and y refer to the same object")

Выход:

 x и y относятся к одному и тому же объекту

In the above example, y = x will create another reference variable y which will refer to the same object because Python optimizes memory utilization by allocation the same object reference to a new variable if the object already exists with the same value.

Теперь давайте изменим значение x и посмотрим, что произойдет.

Выход:

 x и y не относятся к одному и тому же объекту

Итак, теперь x относится к новому объекту x, и связь между x и 10 отключена, но y по-прежнему относится к 10.

Распределение памяти в Python

Есть две части памяти:

  • стековая память
  • куча памяти

Методы / вызовы методов и ссылки хранятся в стековой памяти, а все объекты значений хранятся в частной куче .

Работа стековой памяти

Распределение происходит по непрерывным блокам памяти. Мы называем это выделением памяти стека, потому что распределение происходит в стеке вызовов функций. Размер выделяемой памяти известен компилятору, и всякий раз, когда функция вызывается, ее переменные выделяют память в стеке.

Это память, которая нужна только внутри конкретной функции или вызова метода. Когда функция вызывается, она добавляется в стек вызовов программы. Любые назначения локальной памяти, такие как инициализация переменных внутри определенных функций, временно хранятся в стеке вызовов функций, где они удаляются после возврата из функции, а стек вызовов переходит к следующей задаче. Это распределение в непрерывном блоке памяти обрабатывается компилятором с использованием предопределенных подпрограмм, и разработчикам не нужно об этом беспокоиться.

Example:

def func(): 
        
    # All these variables get memory  
    # allocated on stack  
    a = 20
    b = [] 
    c = "" 

Work of Heap Memory

Память выделяется во время выполнения инструкций, написанных программистами. Обратите внимание, что куча имен не имеет ничего общего со структурой данных кучи. Это называется кучей, потому что это куча пространства памяти, доступного программистам для выделения и освобождения. Переменные необходимы вне вызовов методов или функций или совместно используются несколькими функциями глобально и хранятся в памяти кучи.

Example:

# This memory for 10 integers  
# is allocated on heap.  
a = [0]*10 

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.