Tutorial Material

Xotira boshqaruvi (memory management)

Share to
Python memory management

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:

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.

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

  1. Generator ishlating: oldingi darsda ko'rganimizdek, generator hamma data'ni RAM'ga yuklamaydi.
  2. 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
  1. Global o'zgaruvchilarga ehtiyot bo'ling: global object'lar dastur to'xtamaguncha o'chmaydi (qo'lda o'chirmasangiz).

Xulosa