Python'da yığın / yığın var mı ve bellek nasıl yönetiliyor?


92

Python'da değişkenler ve bellek nasıl yönetilir? Bir yığını ve yığını var mı ve belleği yönetmek için hangi algoritma kullanılıyor? Bu bilgi göz önüne alındığında, çok sayıda / veri sıkıştırma için bellek yönetimi konusunda herhangi bir öneri var mı?



1
Python var / bellek yönetimiyle ilgili, sorun yaşadığınız ve Python belgeleri ve / veya Google tarafından keşfedilmemiş belirli bir sorun var mı?
Martin James

Yanıtlar:


112

Python'da değişkenler ve bellek nasıl yönetilir?

Otomatik olarak! Hayır, gerçekten, sadece bir nesne yaratırsınız ve Python Sanal Makinesi ihtiyaç duyulan belleği ve bellek düzeninde nereye yerleştirileceğini işler.

Bir yığını ve yığını var mı ve belleği yönetmek için hangi algoritma kullanılıyor?

Bahsettiğimiz CPythonzaman, nesneleri depolamak için özel bir yığın kullanır . CPython C API belgelerinden :

Python'da bellek yönetimi, tüm Python nesnelerini ve veri yapılarını içeren özel bir yığın içerir. Bu özel yığının yönetimi dahili olarak Python bellek yöneticisi tarafından sağlanır. Python bellek yöneticisi, paylaşım, bölümleme, ön ayırma veya önbelleğe alma gibi çeşitli dinamik depolama yönetimi yönleriyle ilgilenen farklı bileşenlere sahiptir.

Hafıza ıslahı çoğunlukla referans sayma ile ele alınır . Yani, Python VM bir nesneye kaç referansın başvurduğuna dair dahili bir günlük tutar ve ona atıfta bulunan daha fazla referans olmadığında otomatik olarak çöp toplar. Buna ek olarak, tüm erişilebilir nesneleri bulmaya çalışan geleneksel GC algoritmalarının biraz tersine, nesnelerin erişilemeyen "adalarını" tespit ederek dairesel referansları (referans sayımın idare edemediği) kırmak için bir mekanizma vardır .

NOT: Lütfen bu bilgilerinCPythonözelolduğunu unutmayın. Diğer piton gibi uygulamalar,pypy,iron python,jythononların uygulama özelliklerine gelince ve diğerleri birbirinden ve CPython farklı olabilir. Bunu daha iyi anlamak için, Python anlambilim (dil) ile temeldeki uygulama arasında bir fark olduğunu anlamak yardımcı olabilir.

Bu bilgi göz önüne alındığında, çok sayıda / veri sıkıştırma için bellek yönetimi konusunda herhangi bir öneri var mı?

Şimdi bunun hakkında konuşamam ama eminim ki NumPy'nin (sayı hesaplama için en popüler python kitaplığı) bellek tüketimini zarif bir şekilde ele alan mekanizmalara sahip .

Python'un Internals'ı hakkında daha fazla bilgi edinmek isterseniz, şu kaynaklara bir göz atın:


5
İyi ki Python ile CPython arasındaki farkı
vurgulasınız

1
Yerel değişkenlerin , bir yığın çerçevesinin eşdeğerinde depolanan gerçek değişkenlere sahip olacağını unutmayın .
Marcin

1
Python Java değildir; sanal makinesi yok; tercümanı var. Bunu belirtmek bilgiçlikçi görünebilir, ancak bunlar iki farklı paradigma ve farkın kodun nasıl derlendiği ve çalıştırıldığı konusunda önemli çıkarımları var. stackoverflow.com/questions/441824/…
Apollo2020

49

Python yok herhangi böyle bir şey.

Python dildir ve uygulamaların tam olarak nasıl olduğunu belirtmez Python tarafından tanımlanan semantiğe ulaşması gerektiğini .

Her uygulama (CPython, PyPy, IronPython, Stackless , Jython ...) kendi yapmakta özgürdür!

In C Python, tüm nesneler öbekte:

Python'da bellek yönetimi, tüm Python nesnelerini ve veri yapılarını içeren özel bir yığın içerir. 1

CPython sanal makinesi yığın tabanlıdır:

>>> def g():
    x = 1
    y = 2
    return f(x, y)

>>> import dis
>>> dis.dis(g)
  2           0 LOAD_CONST           1 (1) # Push 1 onto the stack
              3 STORE_FAST           0 (x) # Stores top of stack into local var x

  3           6 LOAD_CONST           2 (2) # Push 2 onto stack
              9 STORE_FAST           1 (y) # Store TOS into local var y

  4          12 LOAD_GLOBAL          0 (f) # Push f onto stack
             15 LOAD_FAST            0 (x) # Push x onto stack
             18 LOAD_FAST            1 (y) # Push y onto stack
             21 CALL_FUNCTION        2     # Execute function with 2 
                                           # f's return value is pushed on stack
             24 RETURN_VALUE               # Return TOS to caller (result of f)

Bunun CPython'a özgü olduğunu unutmayın. Yığın gerçek değerleri içermez, ancak bu nesnelere referansları tutar.

1 : Kaynak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.