Apakah Python memiliki tumpukan / heap dan bagaimana memori dikelola?

92

Bagaimana variabel dan memori dikelola dengan Python? Apakah itu memiliki tumpukan dan tumpukan dan algoritma apa yang digunakan untuk mengelola memori? Berdasarkan pengetahuan ini, adakah rekomendasi tentang manajemen memori untuk pemrosesan data / jumlah besar?

Matt Alcock
sumber
1
Apakah ada masalah khusus dengan Python var / manajemen memori yang Anda hadapi dan tidak mudah ditemukan oleh dokumentasi Python dan / atau Googling?
Martin James

Jawaban:

112

Bagaimana variabel dan memori dikelola dengan Python.

Secara otomatis! Tidak, sungguh, Anda hanya membuat sebuah objek dan Mesin Virtual Python menangani memori yang dibutuhkan dan di mana ia akan ditempatkan di tata letak memori.

Apakah itu memiliki tumpukan dan tumpukan dan algoritma apa yang digunakan untuk mengelola memori?

Ketika kita berbicara tentang CPythonitu menggunakan tumpukan pribadi untuk menyimpan objek. Dari dokumentasi CPython C API :

Manajemen memori di Python melibatkan heap pribadi yang berisi semua objek dan struktur data Python. Pengelolaan tumpukan pribadi ini dipastikan secara internal oleh pengelola memori Python. Manajer memori Python memiliki komponen berbeda yang menangani berbagai aspek manajemen penyimpanan dinamis, seperti berbagi, segmentasi, pra-alokasi, atau caching.

Reklamasi memori sebagian besar ditangani dengan penghitungan referensi . Artinya, VM Python menyimpan jurnal internal tentang berapa banyak referensi yang merujuk ke suatu objek, dan secara otomatis mengumpulkan sampah ketika tidak ada lagi referensi yang merujuk padanya. Selain itu, ada mekanisme untuk memutus referensi melingkar (yang tidak dapat ditangani oleh penghitungan referensi) dengan mendeteksi "pulau" objek yang tidak dapat dijangkau, agak kebalikan dari algoritme GC tradisional yang mencoba menemukan semua objek yang dapat dijangkau.

CATATAN: Harap diingat bahwa informasi iniCPythonspesifik. Implementasi lain python, sepertipypy,iron python,jythondan lain-lain mungkin berbeda satu sama lain dan dari CPython ketika datang ke spesifik pelaksanaannya. Untuk memahami itu dengan lebih baik, mungkin membantu untuk memahami bahwa ada perbedaan antara Python semantik (bahasa) dan implementasi yang mendasarinya

Berdasarkan pengetahuan ini, adakah rekomendasi tentang manajemen memori untuk pemrosesan data / jumlah besar?

Sekarang saya tidak dapat berbicara tentang ini, tetapi saya yakin bahwa NumPy (pustaka python paling populer untuk pengolah angka) memiliki mekanisme yang menangani konsumsi memori dengan baik.

Jika Anda ingin tahu lebih banyak tentang Internal Python, lihat sumber daya ini:

NlightNFotis
sumber
5
Baik Anda, Anda menekankan perbedaan Python vs CPython;)
phant0m
1
Perhatikan bahwa variabel lokal akan menyimpan variabel aktual yang setara dengan bingkai tumpukan.
Marcin
1
Python bukanlah Java; itu tidak memiliki mesin virtual; itu memiliki penerjemah. Mungkin kelihatannya terlalu berlebihan untuk menunjukkan hal ini tetapi mereka adalah dua paradigma yang berbeda dan perbedaannya memiliki implikasi penting tentang bagaimana kode dikompilasi dan dijalankan. stackoverflow.com/questions/441824/…
Apollo2020
49

Python tidak memiliki apa pun hal seperti itu.

Python adalah bahasa dan tidak menentukan bagaimana tepatnya implementasi harus mencapai semantik yang ditentukan oleh bahasa Python.

Setiap implementasi (CPython, PyPy, IronPython, Stackless , Jython ...) gratis untuk melakukan hal sendiri!

Di C Python, semua objek berada di heap:

Manajemen memori di Python melibatkan heap pribadi yang berisi semua objek dan struktur data Python. 1

Mesin virtual CPython berbasis tumpukan:

>>> 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)

Perlu diingat, bahwa ini khusus untuk CPython. Tumpukan tidak berisi nilai sebenarnya , ia menyimpan referensi ke objek tersebut.

1 : Sumber

phant0m
sumber