Python ommabop bo'lishining sabablaridan biri - dasturchi C yoki C++ dagidek qo'lda memory management bilan shug'ullanishi shart emas. Python xotira ajratish (allocation) va bo'shatishni (deallocation) avtomatik bajaradi.
Shunga qaramay, Python xotirani ichkarida qanday boshqarishini tushunish samarali kod yozish uchun muhim, ayniqsa katta data bilan ishlaganda.
1. Heap va Stack
Python ikki xil xotiradan foydalanadi:
- Stack memory: funksiya bajarilishi va lokal o'zgaruvchilar uchun.
- Heap memory: barcha Python object va instance'lar (int, list, class va hokazo) shu yerda saqlanadi. Uni Python Memory Manager boshqaradi.
2. Reference counting
Python xotira boshqaruvidagi asosiy strategiya - reference counting.
Har bir object'ning reference count'i bo'ladi: nechta o'zgaruvchi o'sha object'ga ishora qilayotganini bildiradi.
- Object yaratilsa yoki unga referens berilsa (
a = object), count oshadi (+1). - Referens o'chirilsa (
del a) yoki qamrovdan (scope) chiqsa, count kamayadi (-1). - Count 0 ga tushsa, object xotirasi darhol bo'shatiladi.
import sys
a = []
# Referens sonini olish (kutilganidan yuqori bo'lishi mumkin, chunki sys.getrefcount'ning argumenti ham vaqtinchalik referens)
print(sys.getrefcount(a))
b = a
print(sys.getrefcount(a)) # Increases
del b
print(sys.getrefcount(a)) # Decreases
3. Garbage collection (GC)
Reference counting'ning bitta muammosi bor: circular references.
a = []
b = []
a.append(b)
b.append(a) # Circular reference
Agar a va b o'chirilsa ham, ular bir-biriga ishora qilgani uchun reference count hech qachon 0 bo'lmaydi. Shu yerda Garbage Collector (GC) ishga tushadi.
Python GC alohida mexanizm bo'lib, vaqti-vaqti bilan ishlaydi va circular reference'lardan hosil bo'lgan "garbage"ni topib tozalaydi.
GC'ni gc moduli bilan qo'lda boshqarish mumkin:
import gc
# Garbage collection'ni majburan ishga tushirish
gc.collect()
# Avtomatik garbage collection'ni o'chirish
gc.disable()
Maslahat: odatda gc moduliga kamdan-kam teginasiz, asosan yuqori darajali optimizatsiya uchun kerak bo'ladi.
4. Xotirani tejash bo'yicha maslahatlar
- Generator ishlating: oldingi darsda ko'rganimizdek, generator hamma data'ni RAM'ga yuklamaydi.
- Class'larda
__slots__ishlating: agar kichik class'dan millionlab instance yaratsangiz,__slots__har bir instance uchun dinamik__dict__ni o'chirib, RAM'ni tejaydi.
class SaveMemory:
__slots__ = ['name', 'age'] # Can only have these attributes
def __init__(self, name, age):
self.name = name
self.age = age
- Global o'zgaruvchilarga ehtiyot bo'ling: global object'lar dastur to'xtamaguncha o'chmaydi (qo'lda o'chirmasangiz).
Xulosa
- Python asosan reference counting ishlatadi.
- Garbage collector circular reference'larni tozalaydi.
- Python xotira boshqaruvini tushunib, "memory-efficient" kod yozish mumkin.