Рубрики
Без рубрики

Управление памятью в Python – часть 2

Что такое ссылочный счетчик и как его можно управлять эффективными программами памяти в Python. Помечено с Python, пространством имен, переменными, функциями.

В последней части мы проверили, как переменные хранятся в 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”