Saya telah mencari jawaban akurat untuk pertanyaan ini selama beberapa hari sekarang tetapi belum mendapatkan hasil yang baik. Saya bukan seorang pemula yang lengkap dalam pemrograman, tetapi bahkan belum berada di tingkat menengah.
Ketika saya berada di shell Python, saya mengetik: dir()
dan saya dapat melihat semua nama dari semua objek dalam lingkup saat ini (blok utama), ada 6 di antaranya:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
Kemudian, ketika saya mendeklarasikan sebuah variabel, misalnya x = 10
, itu secara otomatis menambahkan ke daftar objek di bawah modul bawaan dir()
, dan ketika saya mengetik dir()
lagi, itu menunjukkan sekarang:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']
Hal yang sama berlaku untuk fungsi, kelas, dan sebagainya.
Bagaimana cara menghapus semua objek baru tanpa menghapus standar 6 yang tersedia di awal?
Saya telah membaca di sini tentang "pembersihan memori", "pembersihan konsol", yang menghapus semua teks dari jendela prompt perintah:
>>> import sys
>>> clear = lambda: os.system('cls')
>>> clear()
Tapi semua ini tidak ada hubungannya dengan apa yang saya coba capai, itu tidak membersihkan semua objek yang digunakan.
sumber
del
fungsi di luar sana. Saya mulai belajar Python dan sering harus bereksperimen di shell, jadi nama variabel standar sepertix
atauy
sering digunakan dan memulai ulang shell membutuhkan waktu 15 detik lagi untuk melakukannya (saya memiliki laptop yang sangat, sangat tua sekarang). Jadi saya ingin menemukan cara untuk membersihkan memori Python lebih cepat.del
sebenarnya bukan fungsi, karenanya tidak(
dan)
. Ini adalah kata kunci yang memperkenalkan pernyataan del. Tentu saja, cara menghapus suatu objek mungkin melibatkan fungsi, tapi itu cerita lain ...x
atauy
tidak boleh digunakan kecuali Anda menggunakannya. Atau kecuali Anda melakukan sesuatu yang konyolfrom _somemodule_ import *
, maka Anda akan mendapatkan segala macam sampah yang mengacaukan tempat itu. :)Jawaban:
Anda dapat menghapus nama individu dengan
del
:atau Anda dapat menghapusnya dari
globals()
objek:Ini hanyalah sebuah contoh loop; itu defensif hanya menghapus nama yang tidak dimulai dengan garis bawah, membuat asumsi (bukan tidak beralasan) bahwa Anda hanya menggunakan nama tanpa garis bawah di awal interpreter Anda. Anda dapat menggunakan daftar nama yang di-hardcode untuk disimpan sebagai gantinya (daftar putih) jika Anda benar-benar ingin teliti. Tidak ada fungsi bawaan untuk melakukan kliring untuk Anda, selain hanya keluar dan memulai ulang penerjemah.
Modul yang Anda impor (
import os
) akan tetap diimpor karena dirujuk olehsys.modules
; impor selanjutnya akan menggunakan kembali objek modul yang sudah diimpor. Anda tidak akan memiliki referensi ke mereka di namespace global Anda saat ini.sumber
startswith('_')
tampaknya cukup naif. Jika seseorang cukup pintar untuk menulis_foo=42
atau bahkan__foo__=42
, bagaimana kita bisa menghapusnya? Apakah ada cara untuk mendapatkan nama properti modul standar secara terprogram?dir(ModuleType())
, tapi itu hanya kembalidoc
danname
.Iya. Ada cara sederhana untuk menghapus semua yang ada di iPython. Di konsol iPython, cukup ketik:
Kemudian sistem akan meminta Anda untuk mengonfirmasi. Tekan y. Jika Anda tidak ingin melihat prompt ini, cukup ketik:
Ini harus bekerja ..
sumber
Anda dapat menggunakan pengumpul sampah python:
sumber
Jika Anda berada di lingkungan interaktif seperti
Jupyter
atauipython
Anda mungkin tertarik untuk menghapus var yang tidak diinginkan jika semakin berat.Perintah ajaib
reset
dan tersediareset_selective
pada sesi python interaktif sepertiipython
danJupyter
1)
reset
in
danout
parameter menentukan apakah Anda ingin membersihkan cache masuk / keluar. Sejarah direktori dibilas dengandhist
parameter.Yang menarik lainnya adalah
array
hanya menghapus Array numpy:2) reset_selective
Contoh Clean Array:
Sumber: http://ipython.readthedocs.io/en/stable/interactive/magics.html
sumber
Ini berhasil untuk saya.
Anda perlu menjalankannya dua kali sekali untuk global diikuti oleh penduduk setempat
sumber
Sebenarnya python akan mengambil kembali memori yang tidak digunakan lagi, ini disebut pengumpulan sampah yang merupakan proses otomatis di python. Tetapi tetap jika Anda ingin melakukannya maka Anda dapat menghapusnya dengan
del variable_name
. Anda juga dapat melakukannya dengan menetapkan variabel keNone
Satu-satunya cara untuk benar-benar mendapatkan kembali memori dari objek Python yang tidak direferensikan adalah melalui pengumpul sampah. Kata kunci del hanya melepaskan nama dari suatu objek, tetapi objek tersebut masih perlu dikumpulkan sampahnya. Anda dapat memaksa pengumpul sampah untuk dijalankan menggunakan modul gc, tetapi ini hampir pasti merupakan pengoptimalan yang prematur tetapi memiliki risikonya sendiri. Menggunakan
del
tidak memiliki efek nyata, karena nama-nama itu akan dihapus saat keluar dari ruang lingkup.sumber
del
pula memiliki efek nyata di sini.