🤔 Каким образом память в питоне ощищается и выделяется?



В Python память выделяется и очищается с использованием механизмов управления памятью, таких как счетчик ссылок и сборка мусора (garbage collection).



🚩Выделение памяти



🟠Куча (Heap)

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



🟠Менеджер памяти

Менеджер памяти Python выделяет память из кучи и распределяет ее для объектов. Он отслеживает свободные и занятые блоки памяти.



🟠Создание объектов

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



🚩Очистка памяти



🟠Счетчик ссылок (Reference Counting)

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



🟠Сборка мусора (Garbage Collection)

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



🟠Обнаружение циклов

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



import sys

import gc



# Создание объекта и проверка счетчика ссылок

a = [1, 2, 3]

print(sys.getrefcount(a)) # Обычно возвращает 2, так как есть ссылка a и временная ссылка для вызова функции



# Увеличение счетчика ссылок

b = a

print(sys.getrefcount(a)) # Теперь возвращает 3, так как есть ссылки a, b и временная ссылка для вызова функции



# Уменьшение счетчика ссылок

del b

print(sys.getrefcount(a)) # Теперь возвращает 2, так как ссылка b удалена



# Принудительный запуск сборщика мусора

gc.collect()




🚩Память и большие данные



При работе с большими объемами данных полезно использовать более эффективные структуры данных и библиотеки, такие как numpy, которые позволяют более эффективно управлять памятью.

import numpy as np



# Создание большого массива с использованием numpy

large_array = np.zeros((1000, 1000))




Ставь 👍 и забирай 📚 Базу знаний