Gunakan tips ini untuk menganalisis kode Anda dan temukan di mana kode itu paling atau paling tidak efisien.
Karena "ada lebih dari satu cara untuk melakukannya" dengan Python, menemukan pendekatan yang paling hemat memori untuk beberapa tugas bisa jadi menantang. Di sinilah profiler memori dapat membantu. Selain melacak kebocoran, memperkirakan profil memori kode Anda membantu menentukan kode mana yang hemat memori.
Apakah Anda sedang mengembangkan model pembelajaran mesin atau situs web dengan Python, Anda dapat memperkirakan profil memori untuk skrip, baris kode individual, atau fungsi.
Memperkirakan profil memori seluruh basis kode Anda mungkin tidak praktis, karena ini dapat memperlambat aplikasi Anda secara signifikan. Sebaiknya Anda secara selektif membuat profil fungsi atau metode yang Anda duga mungkin menghabiskan lebih banyak memori. Tetapi bahkan jika Anda ingin melakukan ini untuk seluruh aplikasi Anda, Anda mungkin ingin mendedikasikan modul terisolasi untuk menanganinya.
Ada banyak perpustakaan profil di Python. Beberapa yang paling populer adalah
memory_profiler, psutil, Tracemalloc, Dan pympler. Tutorial ini menggunakan memory_profiler Dan psutil.Ketika psutil sangat ideal untuk memperkirakan total konsumsi memori dari suatu metode atau eksekusi fungsi, memory_profiler memberikan informasi penggunaan memori yang lebih terperinci, termasuk tren penggunaan baris demi baris dan tingkat fungsional dari waktu ke waktu.
Untuk memulai, instal memory_profiler ke dalam lingkungan virtual Python Anda. Ini juga menginstal psutil.
pip instal memory_profiler
Dapatkan Ukuran Objek di Memori
Anda dapat memulai pembuatan profil memori dengan terlebih dahulu menghitung ukuran objek yang ingin Anda gunakan di memori.
Jenis pembuatan profil ini sangat membantu di awal pengembangan—saat mencoba menentukan jenis objek mana yang akan digunakan dalam sebuah program.
Misalnya, jika Anda terjebak memutuskan metode mana yang digunakan untuk mencapai suatu tugas, katakanlah, yang sesuai Tipe data Python, Anda bisa mendapatkan ukuran masing-masing dalam byte untuk menentukan mana yang lebih ringan untuk Anda gunakan kasus.
Itu sys.getsizeof metode bawaan sangat berguna di sini:
impor sys
mencetak(f"ukuran daftar: {sys.getsizeof([])} byte")
mencetak(f"ukuran kamus: {sys.getsizeof (dict)} byte")
mencetak(f"ukuran tupel: {sys.getsizeof(())} byte")
mencetak(f"set ukuran: {sys.getsizeof({})} byte")
Inilah hasilnya:
Anda juga dapat menggunakan sys.getsizeof metode untuk membandingkan ukuran memori dari fungsi bawaan dan kustom.
Misalnya, bandingkan fungsi panjang khusus ini dengan itu menggunakan loop Python untuk dengan built-in len fungsi:
impor sys
defgetLength(dapat diubah):
menghitung = 0untuk Saya di dalam dapat diubah:
hitung +=1kembali menghitung
mencetak(f"Fungsi panjang bawaan: {sys.getsizeof (len)} byte")
mencetak(f"Fungsi panjang khusus: {sys.getsizeof (getLength)} byte")
Kode di atas memberikan output berikut:
Namun, sementara sys.getsizeof mengukur ukuran objek dalam memori, itu hanya memperhitungkan objek itu sendiri dan bukan yang mereferensikannya. Untuk itu, Anda memerlukan metode pembuatan profil yang lebih detail.
Temukan Profil Memori dari Fungsi Python
Anda bisa mendapatkan profil memori yang lebih rinci dari setiap baris kode fungsi menggunakan memory_profiler kemasan. Ini melibatkan penambahan @Profil dekorator untuk fungsi atau metode Anda:
impor panda
impor numpy
dari profil impor memory_profilerkelas Memanipulasi:
@Profil
def manipulasiData (sendiri):
df = panda. Bingkai Data({
'A' :[0, 3, numpy.nan, 10, 3, numpy.nan],
'B': [numpy.nan, "Panda", numpy.nan, "Panda", "Python", "JavaScript"],
})df.fillna (method='bfill', inplace=True)
df.fillna (method='isi', inplace=True)
kembali str (df)
manip = Memanipulasi()
cetak (manip.manipulateData())
Kode di atas memberikan profil memori terperinci dari setiap baris kode dalam fungsi seperti yang ditunjukkan:
Itu penggunaan Mem kolom menunjukkan penggunaan memori untuk baris kode tertentu, sedangkan Kenaikan kolom menunjukkan overhead yang dikontribusikan oleh setiap baris. Itu Kejadian kolom menentukan berapa kali baris kode mengalokasikan atau membatalkan alokasi memori.
Misalnya, pada output di atas, baris 11 muncul dua kali dengan penambahan memori sebesar 0,1 MiB (Mebibyte), meningkatkan penggunaan memori menjadi 55,4 MiB. Baris 19 dan 22 juga menyumbang masing-masing 0,2 MiB dan 0,3 MiB, dengan total penggunaan memori menjadi 55,9 MiB.
Temukan Profil Memori dari Skrip Python berdasarkan Timestamp
Anda juga dapat memperkirakan profil memori seluruh skrip Python menggunakan memory_profiler dengan menjalankan mprof perintah di terminal seperti yang ditunjukkan:
mprof jalankan script_name.py
Perintah di atas mengambil sampel skrip yang ditentukan setiap 0,1 detik dan secara otomatis membuat a .dat file di dalam direktori proyek Anda saat ini.
Angka-angka yang mengikuti MEM notasi adalah profil penggunaan memori skrip Python pada interval waktu tertentu. Angka terakhir di sebelah kanan mewakili stempel waktu yang diambil profiler untuk setiap penggunaan memori.
Anda juga bisa mendapatkan sebidang profil memori. Ini membutuhkan instalasi dari matplotlib:
pip instal matplotlib
Setelah diinstal, jalankan mprof perintah seperti ini:
petak mprof
Inilah output dalam kasus ini:
Jalankan Profil Memori Skrip dalam File Python Khusus
Anda mungkin ingin membuat profil untuk berbagai skrip Python. Kamu bisa melakukan ini menggunakan modul Python khusus melalui Python subproses.
Dengan cara ini, Anda dapat memisahkan profiler memori dari basis kode dan menyimpan output grafik secara lokal:
impor subproses
subproses.run([
'mprof', 'berlari', '--sertakan-anak-anak', 'hilang.py'
])
# simpan keluaran plot secara lokal
subproses.run(['mprof', 'merencanakan', '--keluaran=keluaran.jpg'])
Untuk menjalankan profil memori skrip, Anda hanya perlu menjalankan file Python yang berisi kode di atas. Ini menghasilkan plot profil memori (output.jpg) di direktori file:
Temukan Jumlah Memori yang Digunakan Dari Eksekusi Fungsi
Anda dapat menemukan total profil memori dari suatu metode atau fungsi selama eksekusi menggunakan psutil kemasan.
Misalnya, untuk profil sebelumnya Manipulasi Pandas DataFrame metode di dalam file Python lain:
impor psutil
impor sys
impor os
sys.path.append (sys.path[0] + "/..")# impor kelas yang berisi metode Anda
dari kode tertentu.hilang impor Memanipulasi# membuat instance kelas
manip = Memanipulasi()proses = psutil. Proses (os.getpid())
initial_memory = process.memory_info().rss# jalankan metode target:
manip.memanipulasiData()
# dapatkan informasi memori setelah eksekusi
final_memory = process.memory_info().rss
memory_consumed = final_memory - initial_memory
memory_consumed_mb = memori_consumed / (1024 * 1024)
mencetak(f"Memori dikonsumsi oleh fungsi: {memory_consumed_mb:.2F} MB")
Di atas memperkirakan total profil memori metode dalam megabita (MB) seperti yang ditunjukkan:
Temukan Profil Memori Baris Kode di Jupyter Notebook
Jika Anda menggunakan iPython di Jupyter Notebook, Anda dapat menghitung profil memori one-liner menggunakan memory_profiler. Anda hanya perlu memuat memory_profiler dalam satu sel. Kemudian tambahkan %memit fungsi ajaib ke kode Anda di sel berikutnya; ini mengembalikan memori puncak kode dan ukuran yang bertambah.
Metode ini tidak berfungsi dengan skrip Python biasa selain iPython di Jupyter Notebook.
Misalnya:
Anda juga dapat menggunakan %memit fungsi ajaib di Jypyter Notebook untuk membuat profil memori fungsi saat runtime:
Tingkatkan Efisiensi Memori Anda dalam Kode Python Anda
Mempertimbangkan tugas berat untuk mengangkat data yang sering kita gunakan dengan Python, setiap baris kode membutuhkan pengoptimalan yang memadai untuk mengelola penggunaan memori. Sementara Python menampilkan banyak fungsi Python bawaan, objek yang tidak direferensikan mengakibatkan kebocoran memori.
Jika Anda telah menghapus setiap sintaks Python yang berfungsi ke basis kode Anda tanpa mempertimbangkan penggunaan memori, Anda mungkin ingin melihat ke belakang sebelum melangkah terlalu jauh.