Çöp Toplama içinde Python belleğin verimli kullanımını sağlayan, bellek tahsisini ve ayırmayı kaldıran otomatik bir işlemdir. gibi dillerden farklı olarak C veya C++ programcının belleği manuel olarak ayırması ve yeniden ayırması gereken durumlarda Python, belleği iki temel strateji aracılığıyla otomatik olarak yönetir:
- Referans sayımı
- Çöp toplama
Referans sayımı
Python'un kullanım alanları referans sayımı hafızayı yönetmek için. Her nesne kendisine kaç referansın işaret ettiğini takip eder. Referans sayısı sıfıra düştüğünde, yani hiçbir referans kalmadığında Python nesnenin yerini otomatik olarak serbest bırakır. Örnek:
Pythonimport sys x = [1 2 3] print(sys.getrefcount(x)) y = x print(sys.getrefcount(x)) y = None print(sys.getrefcount(x))
Çıkış
2 3 2
Açıklama:
- X başlangıçta iki kez başvurulur (bir kez x ile bir kez getrefcount() ile).
- Atama y = x sayısını artırır.
- Ayar y = Yok bir referansı kaldırır.
Referans Sayma Sorunu
Referans sayımı, döngüsel referansların, yani bir döngüde birbirine referans veren nesnelerin varlığında başarısız olur. Başka hiçbir şey onlara işaret etmese bile referans sayıları asla sıfıra ulaşmaz. Örnek:
Pythonimport sys x = [1 2 3] y = [4 5 6] x.append(y) y.append(x) print(sys.getrefcount(x)) print(sys.getrefcount(y))
Çıkış
3 3
Açıklama:
- X içerir Ve Ve Ve içerir X .
- Sildikten sonra bile X Ve Ve Python sadece referans sayımı kullanarak hafızayı boşaltamayacak çünkü her biri hala diğerine referans veriyor.
Döngüsel Referanslar için çöp toplama
Çöp toplama Artık erişilemeyen veya uygulama tarafından kullanılmayan belleği otomatik olarak geri kazanmak için programlama dillerinde kullanılan bir bellek yönetimi tekniğidir. Bu tür döngüsel referansları işlemek için Python bir Çöp Toplayıcı (GC) yerleşik gc modülünden. Bu toplayıcı, referans döngülerine dahil olan nesneleri tespit edebilir ve temizleyebilir.
Nesil Çöp Toplama
Python'un Nesil Çöp Toplayıcısı döngüsel referanslarla başa çıkmak için tasarlanmıştır. Nesneleri yaşam sürelerine göre üç nesile ayırır:
- Nesil 0: Yeni oluşturulan nesneler.
- Nesil 1: Bir toplama döngüsünden sağ çıkan nesneler.
- 2. Nesil: Uzun ömürlü nesneler.
Referans döngüleri meydana geldiğinde, çöp toplayıcı bunları otomatik olarak algılar ve temizler, böylece bellekte yer açılır.
Döngülerin Otomatik Çöp Toplama
Tahsis sayısı serbest tahsis sayısını belirli bir eşik kadar aştığında çöp toplama otomatik olarak çalışır. Bu eşik gc modülü kullanılarak incelenebilir.
Pythonimport gc print(gc.get_threshold())
Çıkış
(2000 10 10)
Açıklama: 0 1 ve 2. nesiller için eşik tuple'ını döndürür. Tahsisler eşik değerini aştığında toplama tetiklenir.
Manuel çöp toplama
Bazen, özellikle referans döngüleri söz konusu olduğunda çöp toplayıcıyı manuel olarak çağırmak faydalı olabilir. Örnek:
Pythonimport gc # Create a cycle def fun(i): x = {} x[i + 1] = x return x # Trigger garbage collection c = gc.collect() print(c) for i in range(10): fun(i) c = gc.collect() print(c)
Çıkış
0 10
Açıklama:
- kesinlikle eğlenceli(i) kendisi bir sözlük referansı yaparak döngüsel bir referans oluşturur.
- gc.collect() çöp toplamayı tetikler ve toplanan nesnelerin sayısını saklar (başlangıçta 0).
- aralıktaki i için(10) aramalar eğlence(i) 10 kez 10 döngüsel referans oluşturma.
- gc.collect() çöp toplamayı yeniden tetikler ve toplanan döngülerin sayısını yazdırır.
Manuel çöp toplama türleri
- Zamana dayalı çöp toplama: Çöp toplayıcı sabit zaman aralıklarında tetiklenir.
- Olaya dayalı çöp toplama: Çöp toplayıcı, bir kullanıcının uygulamadan çıkması veya uygulamanın boşta kalması gibi belirli olaylara yanıt olarak çağrılır.
Zorla çöp toplama
Python'un çöp toplayıcısı (GC), kullanılmayan nesneleri temizlemek için otomatik olarak çalışır. Manuel olarak zorlamak için gc modülündeki gc.collect() öğesini kullanın. Örnek:
Pythonimport gc a = [1 2 3] b = {'a': 1 'b': 2} c = 'Hello world!' del abc gc.collect()
Açıklama:
- a b c'den referansları siler bir b Ve C onları çöp toplamaya uygun hale getiriyoruz.
- gc.collect() referans verilmeyen nesneleri temizleyerek çöp toplama işlemini belleği boşaltmaya zorlar.
Çöp toplamayı devre dışı bırakma
Python'da çöp toplayıcı, referans verilmeyen nesneleri temizlemek için otomatik olarak çalışır. Çalışmasını önlemek için gc modülündeki gc.disable() işlevini kullanarak devre dışı bırakabilirsiniz. Örnek:
Pythonimport gc gc.disable() gc.enable()
Açıklama:
- gc.disable() otomatik çöp toplamayı devre dışı bırakır.
- gc.enable() otomatik çöp toplamayı yeniden etkinleştirir.
Python çöp toplayıcıyla etkileşim kurma
Python çöp toplayıcı adı verilen yerleşik bir mekanizma, belleği boşaltmak ve bellek sızıntılarını durdurmak için artık başvurulmayan nesneleri otomatik olarak ortadan kaldırır. Python gc modülü, genellikle otomatik olarak yürütülen çöp toplayıcıyla etkileşime geçmek için çeşitli yollar sunar.
1. Çöp toplayıcıyı etkinleştirme ve devre dışı bırakma: Çöp toplayıcıyı kullanarak etkinleştirebilir veya devre dışı bırakabilirsiniz. gc. olanak vermek() Ve gc. devre dışı bırakmak() sırasıyla işlevler. Örnek :
Java'daki dizelerle karşılaştırınPython
import gc # Disable gc.disable() # Enable gc.enable()
2. Çöp toplamayı zorlamak: Bir çöp toplama işlemini manüel olarak tetikleyebilirsiniz. gc. TOPLAMAK() işlev. Bu, otomatik çöp toplamanın gerçekleşmesini beklemek yerine anında çöp toplamayı zorlamak istediğiniz durumlarda yararlı olabilir. Örnek:
Pythonimport gc gc.collect()
3. Çöp toplayıcı ayarlarının incelenmesi: Çöp toplayıcının mevcut ayarlarını kullanarak inceleyebilirsiniz. gc.get_threshold() 0 1 ve 2. nesiller için geçerli eşikleri temsil eden bir demet döndüren işlev. Örnek:
Pythonimport gc t = gc.get_threshold() print(t)
Çıkış
(2000 10 10)
4. Çöp toplayıcı eşiklerini ayarlama: Çöp toplama için eşikleri aşağıdakileri kullanarak ayarlayabilirsiniz: gc.set_threshold() işlev. Bu, çöp toplama sıklığını etkileyebilecek farklı nesiller için eşikleri manuel olarak ayarlamanıza olanak tanır. Örnek:
Pythonimport gc gc.set_threshold(500 5 5) t = gc.get_threshold() print(t)
Çıkış
(500 5 5)
Avantajları ve Dezavantajları
Python'un çöp toplama işleminin bazı avantajlarını ve dezavantajlarını inceleyelim.
Avantajları | Dezavantajları |
|---|---|
Otomatik Bellek Yönetimi | Performans yükü getirebilir |
Manuel Bellek İşleme Yok | Bellek kavramlarının anlaşılmasını gerektirir |
Nesiller Boyunca Verimli Temizleme | GC'nin zamanlaması üzerinde sınırlı kontrol |
Özelleştirilebilir GC Ayarları | Hata veya bellek sızıntısı olasılığı |