В последней части мы проверили, как переменные хранятся в Python и как Python обрабатывает управление памятью со ссылкой и сборщиком мусора. Если вы не проверили его, и хотите вот ссылка.
В этой части мы немного погрузимся на то, как подсчет ссылок и как он может увеличить или уменьшить с учетом различных случаев. Итак, давайте начнем откуда мы остановились, каждый объект в Python имеет три вещи
Type Reference Count Value
Ссылочный счет – это значение, показывающее, насколько объект был передан (указан) тоже другими именами (переменными). Подсчет ссылок помогает сборщику мусора в освобождении пространства, поэтому программа может работать эффективно. Хотя мы можем увеличить или уменьшить значение эталонного подсчета и может проверить значение с встроенной функцией Getrefcount ().
Давайте сделаем небольшой фрагмент кода:
import sys a = [] # Two reference one from the variable and one from the getrefcount() function print(sys.getrefcount()) 2
Хотя примеры выглядят великолепно, и все, кажется, работает, но я сделал вроде трюки, во-первых, во-первых, что не все значения ссылочных счетчиков начинаются с 0 Поэтому, если вы сделаете тот же пример с различным значением выхода, может быть разным. Значения ссылочного подсчета рассчитываются по двум факторам, количеством раз, когда объект используется в Bytecode и количество времени, которое оно тоже ссылается на это включает в себя ваши предыдущие программы.
Давайте посмотрим на другой пример:
import sys a = 100 print(sys.getrefcount(a)) 4 b = 100 print(sys.getrefcount(b)) 5 c = 100 print(sys.getrefcount(c)) 6
При большем количестве переменных ссылаются на одно и то же значение, присвоение ссылок увеличивается. Но это не так, когда мы принимаем в примере случая объектов контейнеров, как списки и константы.
import sys ex_list = [a,b,c,d] print(sys.getrefcount(a)) 8 print(sys.getrefcount(b)) 9 print(sys.getrefcount(c)) 10 print(sys.getrefcount(d)) 11 del ex_list print(sys.getrefcount(a)) 7 print(sys.getrefcount(b)) 8 print(sys.getrefcount(c)) 9 print(sys.getrefcount(d)) 10 # Same thing goes with constants print(sys.getrefcount(10)) 12 const = 10 print(sys.getrefcount(10)) 13 const = const + 10 print(sys.getrefcount(10)) 12
Когда мы увидели список контейнеров здесь Список, обратитесь к другим объектам, относящимся к значению, таким образом, когда мы удаляем их, ссылка на ссылку удаляется, таким образом, при этом объекты внутри списка уменьшают ссылку на один. То же самое происходит с константами тоже, когда переменная, которую они ссылаются, наращивают, увеличивается, подсчет эталона уменьшается.
К настоящему времени вы, должно быть, поняли, что DEL на самом деле не удаляет объект напротив, он удаляет эту переменную (имя) в качестве ссылки на этот объект и уменьшить количество ссылок на один.
Весь пример, который мы увидели, это вроде похожее, учитывая тот факт, что они находятся в глобальном пространстве имен, но что происходит, когда есть функция, что происходит с ссылкой, то, давайте выясним через этот фрагмент кода.
import sys num = 100 print(sys.getrefcount(num)) 4 def ytf(number): print(sys.getrefcount(num)) ytf(num) 6 print(sys.getrefcount(num)) 4
Мы видели, что когда YTF () попал в область применения, приведенный эталон увеличился, в то время как ссылочный счетчик уменьшился, когда функция вышла из-за объема. Условливая это, что мы должны быть осторожны с использованием больших или сложных объектов в глобальном пространстве имен на глобальном пространстве, потому что объект в глобальном пространстве имен не выходит из неисправности, если мы не уменьшаем значение ссылочного отчета, поэтому большой объект будет потреблять больше памяти сделать программу менее эффективной.
Это все для этой части, в следующей части мы будем внимательно смотреть в сборщик мусора и как он функционирует внутри программы Python в освобождении памяти.
Оригинал: “https://dev.to/pradhvan/memory-managment-in-python–part-2-56dc”