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?
python
memory
memory-management
Matt Alcock
sumber
sumber
Jawaban:
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.
Ketika kita berbicara tentang
CPython
itu menggunakan tumpukan pribadi untuk menyimpan objek. Dari dokumentasi CPython C API :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 ini
CPython
spesifik. Implementasi lain python, sepertipypy
,iron python
,jython
dan 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 mendasarinyaSekarang 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:
sumber
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:
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
sumber