Python tricks #1: __slots__

Mazlum Ağar
3 min readNov 27, 2018

--

Kullanıma geçmeden hemen önce çok kısa bir dipnot vererek başlayayım. Python’da dictionary mutable yani değiştirilebilir objeler iken tuple objeleri immutable yani değiştirilemez objelerdir.

Yukarıdaki örnekte gördüğümüz gibi boş bir dictionary 240 bytes kaplarken boş bir tuple objesi 48 bytes yer kaplamaktadır.

Python bir class’ın attribute’larını saklamak için varsayılan olarak obje içerisindeki __dict__ adındaki dictionary’i kullanır. Bu durum runtime’da yeni attribute eklemek için oldukça yararlıdır. Ama memory kullanımını oldukça arttırmaktadır. Biz de Python’a diyeceğiz ki; sen dictionary kullanmak yerine tuple kullan. Yukarıdaki örnekte gördüğümüz gibi bu bizim daha az memory kullanmamızı sağlayacak. Şimdi örnekleyelim;

Şimdi yukarıdaki örnekte neler olup bittiğine bakalım. Burada x ve y şeklinde iki tane attribute bulunan bir class oluşturduk. p nesnesinin __dict__ değerine ulaştığımızda attribute’larını görebiliyoruz. Burada dikkat etmemiz gereken nokta; __dict__ bir dictionary olduğu için eleman sayısı sınırlı değildir ve istediğimiz gibi genişletebiliriz.

Gördüğümüz gibi genişletebildik. Şimdi aynı örneği bir de slots ile yapalım.

Burada dikkatinizi çekmiştir, getsizeof boyutunu aldığımızda ilk örnek ile aynı boyutu verdi. getsizeof bize objenin boyutunu veriyor. Objenin referans verdiği diğer objeleri (burada __dict__) hesaba katmadığı için ikisinde de sonuç aynı oldu. Bu yüzden ilk örneğimizdeki objenin kapladığı alan 112 + 56 = 168 bytes’dır.

p2 objesinin __dict__ attribute’na ulaşmaya çalıştığımızda böyle bir attirbute olmadığına dair hata aldık. Çünkü __slots__ ile belirttiğimiz için artık Python o objenin attribute’larını dict içerisinde tutmuyor. Şimdi genişletmeye çalışalım.

Genişletmeye çalıştığımızda da aynı hatayı aldık.

Çünkü Python artık oluşturduğumuz objenin attribute’larını mutable(değişken) olan bir obje olan dictionary içerisinde tutmak yerine immutable(değişmez) bir obje olan tuple içerisinde tutmaya başladığı için daha sonradan ekleme yapamıyoruz.

Bu şekilde __slots__ ile çok daha az memory kullanımı yapabiliyoruz.

Şimdi bir örnek daha yapalım ve daha anlaşılır kılalım.

Yukarıdaki örnekte çok basit veriler üzerinde bile memory ve zaman anlamındaki farkı görebilirsiniz.

Kolay gelsin.

--

--