0Pricing
Python Academy · Ders

__slots__ ve Bellek Optimizasyonu

Örnek başına bellek yükünü azaltmak için __slots__ kullanın.

__slots__ ve Bellek Optimizasyonu, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.

Varsayılan __dict__ Ek Yükü

Varsayılan olarak her Python örneği, özniteliklerini önemli bir bellek ek yüküne sahip olan bir __dict__ sözlüğünde saklar; bu ek yük genellikle örnek başına 200-400 bayttır.

import sys

class Point:
    def __init__(self, x, y): self.x, self.y = x, y

p = Point(1, 2)
print(sys.getsizeof(p.__dict__))   # ~200 bytes

__slots__ Tanımlama

__slots__ öznitelik adlarından oluşan bir dizi olarak tanımlanır. Python, sözlük yerine sabit boyutlu bir dizi ayırarak bellek tasarrufu sağlar.

class SlottedPoint:
    __slots__ = ("x", "y")

    def __init__(self, x, y):
        self.x = x
        self.y = y

p = SlottedPoint(1, 2)
print(p.x, p.y)   # 1 2
# p.z = 3   # AttributeError: no __dict__

Bellek Tasarrufu

__slots__ kullanıldığında her örnek, sözlük tabanlı bir örneğe kıyasla genellikle %30-50 daha az bellek kullanır; milyonlarca nesne oluşturulurken bu önemli bir tasarruftur.

import sys

class Reg:
    def __init__(self, x, y): self.x, self.y = x, y

class Slotted:
    __slots__ = ("x","y")
    def __init__(self, x, y): self.x, self.y = x, y

print(sys.getsizeof(Reg(1,2)))      # ~56 bytes + ~200 dict
print(sys.getsizeof(Slotted(1,2)))  # ~56 bytes (no dict)

Varsayılan Olarak __dict__ Yoktur

Yuva kullanan bir sınıfta __dict__ bulunmaz; bu nedenle oluşturma işleminden sonra rastgele öznitelikler ekleyemezsiniz.

class Config:
    __slots__ = ("host", "port")
    def __init__(self, h, p): self.host, self.port = h, p

c = Config("localhost", 8080)
# c.debug = True   # AttributeError
print(hasattr(c, "__dict__"))   # False

__slots__ ile __dict__ Kullanımını Sürdürme

Örnek başına bir sözlüğü korurken yaygın öznitelikleri yuvalar olarak önceden tanımlamak için "__dict__" ifadesini __slots__ içine ekleyin.

class Hybrid:
    __slots__ = ("x", "__dict__")

    def __init__(self, x):
        self.x = x

h = Hybrid(1)
h.extra = "dynamic"   # allowed
print(h.extra)

__slots__ İçinde __weakref__

Yuva kullanan sınıflar zayıf başvuru desteğini kaybeder. Bu desteği yeniden etkinleştirmek için "__weakref__" ifadesini __slots__ içine ekleyin.

import weakref

class Node:
    __slots__ = ("value", "__weakref__")
    def __init__(self, v): self.value = v

n = Node(42)
ref = weakref.ref(n)
print(ref())  # <Node object>

Kalıtım ve __slots__

Üst sınıf __slots__ kullanmıyorsa alt sınıf yine bir __dict__ alır. Tam tasarruf için sınıf hiyerarşisinin tamamı __slots__ tanımlamalıdır.

class Base:
    __slots__ = ("x",)

class Child(Base):
    __slots__ = ("y",)   # no __dict__

class WithoutSlots(Base):
    pass   # gets __dict__ from object

Belleği Karşılaştırmalı Ölçme

__slots__ eklemeden önceki ve ekledikten sonraki gerçek bellek kullanımını ölçmek için tracemalloc veya pympler kullanın.

import tracemalloc

tracemalloc.start()
points = [SlottedPoint(i, i) for i in range(100_000)]
current, peak = tracemalloc.get_traced_memory()
tracemalloc.stop()
print(f"Peak: {peak/1024/1024:.1f} MB")

__slots__ ve Serileştirme

Yuva kullanan nesneler, __getstate__ ve __setstate__ tanımlarsanız veya Python 3'ten itibaren yuvaları otomatik olarak işleyen varsayılan serileştirme protokolünü kullanırsanız serileştirilebilir.

import pickle

class Point:
    __slots__ = ("x", "y")
    def __init__(self, x, y): self.x, self.y = x, y

p = Point(3, 4)
data = pickle.dumps(p)
p2 = pickle.loads(data)
print(p2.x, p2.y)   # 3 4

__slots__ ile veri sınıfları — Python 3.10+

@dataclass ifadesine slots=True geçirerek __slots__ ifadesinin otomatik olarak oluşturulmasını sağlayın.

from dataclasses import dataclass

@dataclass(slots=True)
class Vector:
    x: float
    y: float

v = Vector(1.0, 2.0)
print(v.x, v.y)   # 1.0 2.0
print(hasattr(v, "__dict__"))   # False

__slots__ Ne Zaman Kullanılmalı

__slots__ şu durumlarda kullanılmalıdır: milyonlarca örnek oluştururken, bellek kısıtlıyken veya öznitelik erişim hızı kritik olduğunda. Esnekliğin daha önemli olduğu genel amaçlı sınıflarda kullanmayın.

# Good candidates:
# - Nodes in a large graph or tree
# - Records in a large dataset
# - High-frequency event objects

# Bad candidates:
# - Configuration objects added to ad-hoc
# - Classes that mix-in dynamic attributes

Hızlı Kontrol

Yuva kullanan bir örnekte __slots__ içinde listelenmeyen bir özniteliği ayarlamaya çalıştığınızda ne olur?

Özet

__slots__, örnek başına kullanılan __dict__ sözlüğünün yerini sabit bir diziyle değiştirerek %30-50 bellek tasarrufu sağlar. İhtiyacınız varsa "__dict__" veya "__weakref__" ifadelerini ekleyin. Tam tasarruf için kalıtım zincirinin tamamı __slots__ kullanmalıdır. Python 3.10 ve sonraki sürümlerde @dataclass(slots=True) kullanın.

Sıkça Sorulan Sorular

“__slots__ ve Bellek Optimizasyonu” dersi ücretsiz mi?

Evet — “__slots__ ve Bellek Optimizasyonu” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.

“__slots__ ve Bellek Optimizasyonu” dersinde ne öğreneceğim?

Örnek başına bellek yükünü azaltmak için __slots__ kullanın. Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Python Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“__slots__ ve Bellek Optimizasyonu” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Python Sınıfları Nasıl Oluşturulur
  2. Özel Üst Sınıflar Yazma
  3. Tanımlayıcılar: __get__, __set__, __delete__
  4. __slots__ ve Bellek Optimizasyonu
← Python Academy Sayfasına Dön