PYPROGLIB Telegram 6553
🏗 Управление памятью в Python: как это работает

Python сам выделяет и очищает память, чтобы вы не думали о байтах и указателях. Но иногда автоматике стоит помочь.

1. Python управляет памятью автоматически

Когда вы пишете x = [1, 2, 3], Python не заставляет вас думать о байтах и указателях. Он сам выделяет память, отслеживает объекты и убирает мусор. Всё это делает менеджер памяти, который хранит:

▪️ Тип данных (int, list, dict)
▪️ Счетчик ссылок (кто использует объект)
▪️ Значение (сами данные)

Такой подход удобен: нет «висячих указателей», не нужно вручную вызывать malloc/free, а ресурсы оптимизируются автоматически.

2. Счетчик ссылок

Каждый объект в Python — как воздушный шарик. Пока его кто-то держит (есть ссылки), он остается. Если все нити отпущены — объект исчезает.

Как это работает:
import sys

a = [1, 2, 3]
print(sys.getrefcount(a)) # 2 (одна ссылка в переменной + вызов функции)
b = a
print(sys.getrefcount(a)) # 3 (еще одна ссылка)
del a
print(sys.getrefcount(b)) # 2 (одна ссылка удалена)
b = None # Объект больше не используется → удален


💡Но есть нюансы: Python кэширует строки и мелкие числа (-5 до 256), поэтому их ссылки могут не изменяться.

3. Сборщик мусора

Если объекты ссылаются друг на друга, счетчик ссылок их не удалит. Например:
class Node:
def __init__(self):
self.parent = None

a = Node()
b = Node()
a.parent = b
b.parent = a # Циклическая ссылка!


Такие объекты удаляет сборщик мусора (Garbage Collector, GC), используя алгоритм поколений:

🍼 Поколение 0 — новые объекты, проверяются чаще.
🧑‍💼 Поколение 1 — пережили одну проверку.
🦖 Поколение 2 — «старожилы», проверяются реже.

Управление GC:
import gc
gc.collect() # Принудительный запуск
gc.set_threshold(700, 10, 10) # Настройка частоты очистки


💡 Совет: если у вас много циклических объектов, очищайте их вручную (gc.collect()).

4. Как оптимизировать память вручную

🔸 slots для уменьшения потребления памяти:
class User:
slots = ['name', 'age'] # Экономит до 40% памяти

def __init__(self, name, age):
self.name = name
self.age = age


🔸 Генераторы вместо списков:
 # Неоптимально:
lines = open("data.txt").readlines() #Весь файл в памяти!

# Оптимально:
def read_lines(filename):
with open(filename) as f:
for line in f:
yield line # Читаем по одной строке


🔸 Массивы вместо списков:
import array
numbers = array.array('i', [1, 2, 3, 4, 5]) # Числовой массив (экономия памяти)


🔸 Кэширование с lru_cache:
from functools import lru_cache

@lru_cache(maxsize=1000)
def compute(x):
return x 2 # Кэширует результаты функции


5. Как искать утечки памяти

🔸 Используем tracemalloc — показывает, где «утекает» память:
import tracemalloc

tracemalloc.start()
data = [x for x in range(10_000)] # Проблемный код

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
print(top_stats[0]) # Где выделена память?


🔸 Визуализация с objgraph — рисует граф зависимостей:
import objgraph
objgraph.show_most_common_types(limit=5) # Какие объекты «размножаются»?


📌 Подробнее про управление памятью в Python: https://clc.to/SNaUtg

Библиотека питониста #буст
👍254❤‍🔥1



tgoop.com/pyproglib/6553
Create:
Last Update:

🏗 Управление памятью в Python: как это работает

Python сам выделяет и очищает память, чтобы вы не думали о байтах и указателях. Но иногда автоматике стоит помочь.

1. Python управляет памятью автоматически

Когда вы пишете x = [1, 2, 3], Python не заставляет вас думать о байтах и указателях. Он сам выделяет память, отслеживает объекты и убирает мусор. Всё это делает менеджер памяти, который хранит:

▪️ Тип данных (int, list, dict)
▪️ Счетчик ссылок (кто использует объект)
▪️ Значение (сами данные)

Такой подход удобен: нет «висячих указателей», не нужно вручную вызывать malloc/free, а ресурсы оптимизируются автоматически.

2. Счетчик ссылок

Каждый объект в Python — как воздушный шарик. Пока его кто-то держит (есть ссылки), он остается. Если все нити отпущены — объект исчезает.

Как это работает:

import sys

a = [1, 2, 3]
print(sys.getrefcount(a)) # 2 (одна ссылка в переменной + вызов функции)
b = a
print(sys.getrefcount(a)) # 3 (еще одна ссылка)
del a
print(sys.getrefcount(b)) # 2 (одна ссылка удалена)
b = None # Объект больше не используется → удален


💡Но есть нюансы: Python кэширует строки и мелкие числа (-5 до 256), поэтому их ссылки могут не изменяться.

3. Сборщик мусора

Если объекты ссылаются друг на друга, счетчик ссылок их не удалит. Например:
class Node:
def __init__(self):
self.parent = None

a = Node()
b = Node()
a.parent = b
b.parent = a # Циклическая ссылка!


Такие объекты удаляет сборщик мусора (Garbage Collector, GC), используя алгоритм поколений:

🍼 Поколение 0 — новые объекты, проверяются чаще.
🧑‍💼 Поколение 1 — пережили одну проверку.
🦖 Поколение 2 — «старожилы», проверяются реже.

Управление GC:
import gc
gc.collect() # Принудительный запуск
gc.set_threshold(700, 10, 10) # Настройка частоты очистки


💡 Совет: если у вас много циклических объектов, очищайте их вручную (gc.collect()).

4. Как оптимизировать память вручную

🔸 slots для уменьшения потребления памяти:
class User:
slots = ['name', 'age'] # Экономит до 40% памяти

def __init__(self, name, age):
self.name = name
self.age = age


🔸 Генераторы вместо списков:
 # Неоптимально:
lines = open("data.txt").readlines() #Весь файл в памяти!

# Оптимально:
def read_lines(filename):
with open(filename) as f:
for line in f:
yield line # Читаем по одной строке


🔸 Массивы вместо списков:
import array
numbers = array.array('i', [1, 2, 3, 4, 5]) # Числовой массив (экономия памяти)


🔸 Кэширование с lru_cache:
from functools import lru_cache

@lru_cache(maxsize=1000)
def compute(x):
return x 2 # Кэширует результаты функции


5. Как искать утечки памяти

🔸 Используем tracemalloc — показывает, где «утекает» память:
import tracemalloc

tracemalloc.start()
data = [x for x in range(10_000)] # Проблемный код

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
print(top_stats[0]) # Где выделена память?


🔸 Визуализация с objgraph — рисует граф зависимостей:
import objgraph
objgraph.show_most_common_types(limit=5) # Какие объекты «размножаются»?


📌 Подробнее про управление памятью в Python: https://clc.to/SNaUtg

Библиотека питониста #буст

BY Библиотека питониста | Python, Django, Flask




Share with your friend now:
tgoop.com/pyproglib/6553

View MORE
Open in Telegram


Telegram News

Date: |

The court said the defendant had also incited people to commit public nuisance, with messages calling on them to take part in rallies and demonstrations including at Hong Kong International Airport, to block roads and to paralyse the public transportation system. Various forms of protest promoted on the messaging platform included general strikes, lunchtime protests and silent sit-ins. Telegram Android app: Open the chats list, click the menu icon and select “New Channel.” Commenting about the court's concerns about the spread of false information related to the elections, Minister Fachin noted Brazil is "facing circumstances that could put Brazil's democracy at risk." During the meeting, the information technology secretary at the TSE, Julio Valente, put forward a list of requests the court believes will disinformation. Among the requests, the Brazilian electoral Court wanted to know if they could obtain data on the origins of malicious content posted on the platform. According to the TSE, this would enable the authorities to track false content and identify the user responsible for publishing it in the first place. As of Thursday, the SUCK Channel had 34,146 subscribers, with only one message dated August 28, 2020. It was an announcement stating that police had removed all posts on the channel because its content “contravenes the laws of Hong Kong.”
from us


Telegram Библиотека питониста | Python, Django, Flask
FROM American