Profiler memori Python mana yang disarankan? [Tutup]

671

Saya ingin tahu penggunaan memori aplikasi Python saya dan secara khusus ingin tahu blok kode apa / bagian atau objek yang menghabiskan sebagian besar memori. Pencarian Google menunjukkan yang komersial adalah Python Memory Validator (hanya Windows).

Dan yang open source adalah PySizer dan Heapy .

Saya belum mencoba siapa pun, jadi saya ingin tahu yang mana yang terbaik mempertimbangkan:

  1. Memberikan sebagian besar detail.

  2. Saya harus melakukan sedikit atau tidak ada perubahan pada kode saya.

Anurag Uniyal
sumber
2
Untuk menemukan sumber kebocoran, saya sarankan objgraph.
pi.
9
@MikeiLL Ada tempat untuk pertanyaan seperti ini: Rekomendasi Perangkat Lunak
Poik
2
Ini cukup sering terjadi sehingga kita seharusnya dapat memigrasi satu pertanyaan ke forum lain.
zabumba
Satu tip: Jika seseorang menggunakan gae to dan want's untuk memeriksa penggunaan memori - itu adalah sakit kepala yang besar, karena alat-alat itu tidak menghasilkan apa-apa atau peristiwa tidak dimulai. Jika Anda ingin menguji sesuatu yang kecil, pindahkan fungsi yang ingin Anda uji untuk memisahkan file, dan jalankan file ini sendirian.
alexche8
4
Saya merekomendasikan pympler
zzzeek

Jawaban:

288

Heapy cukup mudah digunakan. Pada titik tertentu dalam kode Anda, Anda harus menulis yang berikut ini:

from guppy import hpy
h = hpy()
print(h.heap())

Ini memberi Anda beberapa output seperti ini:

Partition of a set of 132527 objects. Total size = 8301532 bytes.
Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
0  35144  27  2140412  26   2140412  26 str
1  38397  29  1309020  16   3449432  42 tuple
2    530   0   739856   9   4189288  50 dict (no owner)

Anda juga dapat mencari tahu dari mana objek direferensikan dan mendapatkan statistik tentang itu, tetapi entah bagaimana dokumen yang agak jarang.

Ada juga browser grafis, yang ditulis dalam Tk.

Torsten Marek
sumber
24
Jika Anda menggunakan Python 2.7, Anda mungkin memerlukan versi trunk-nya: sourceforge.net/tracker/… ,pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy
James Snyder
27
Dokumen heapy itu ... tidak baik. Tapi saya menemukan posting blog ini sangat membantu untuk memulai: smira.ru/wp-content/uploads/2011/08/heapy.html
Joe Shaw
4
Catatan, heapy tidak termasuk memori yang dialokasikan dalam ekstensi python. Jika ada yang berhasil menemukan mekanisme untuk memasukkan banyak boost::pythonobjek, akan menyenangkan untuk melihat beberapa contoh!
Amos
34
Pada 2014-07-06, guppy tidak mendukung Python 3.
Quentin Pradet
5
Ada garpu guppy yang mendukung Python 3 yang disebut guppy3.
David Foster
385

Karena tidak ada yang menyebutkannya, saya akan menunjuk ke module memory_profiler saya yang mampu mencetak laporan baris demi baris penggunaan memori dan bekerja pada Unix dan Windows (perlu psutil pada yang terakhir ini). Keluaran tidak terlalu rinci tetapi tujuannya adalah untuk memberi Anda gambaran di mana kode memakan lebih banyak memori dan bukan analisis lengkap tentang objek yang dialokasikan.

Setelah mendekorasi fungsi Anda dengan @profiledan menjalankan kode Anda dengan -m memory_profilerbendera itu akan mencetak laporan baris-demi-baris seperti ini:

Line #    Mem usage  Increment   Line Contents
==============================================
     3                           @profile
     4      5.97 MB    0.00 MB   def my_func():
     5     13.61 MB    7.64 MB       a = [1] * (10 ** 6)
     6    166.20 MB  152.59 MB       b = [2] * (2 * 10 ** 7)
     7     13.61 MB -152.59 MB       del b
     8     13.61 MB    0.00 MB       return a
Fabian Pedregosa
sumber
1
Untuk usecase saya - skrip manipulasi gambar sederhana, bukan sistem yang rumit, yang membuat beberapa kursor terbuka - ini adalah solusi terbaik. Sangat mudah untuk masuk dan mencari tahu apa yang terjadi, dengan gunk minimal ditambahkan ke kode Anda. Sempurna untuk perbaikan cepat dan mungkin bagus untuk aplikasi lain juga.
driftcatcher
10
Saya menemukan memory_profiler sangat sederhana dan mudah digunakan. Saya ingin melakukan profil per baris dan bukan per objek. Terima kasih sudah menulis.
tommy.carstensen
1
@FabianPedregosa bagaimana dosis memory_profiler menangani loop, bisakah ia mengidentifikasi nomor iterasi loop?
Glen Fletcher
3
Ini mengidentifikasi loop hanya secara implisit ketika mencoba untuk melaporkan jumlah baris-demi-baris dan ia menemukan baris duplikat. Dalam hal ini hanya akan mengambil maks semua iterasi.
Fabian Pedregosa
1
@FabianPedregosa Apakah memory_profilerbuffer outputnya? Saya mungkin melakukan sesuatu yang salah, tetapi tampaknya alih-alih membuang profil untuk suatu fungsi ketika selesai, ia menunggu skrip berakhir.
Greenstick
80

Saya merekomendasikan Dowser . Pengaturannya sangat mudah, dan Anda perlu nol perubahan pada kode Anda. Anda dapat melihat jumlah objek dari setiap jenis melalui waktu, melihat daftar objek hidup, melihat referensi ke objek hidup, semua dari antarmuka web sederhana.

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.server.quickstart()
    cherrypy.engine.start(blocking=False)

Anda mengimpor memdebug, dan memanggil memdebug.start. Itu saja.

Saya belum mencoba PySizer atau Heapy. Saya akan menghargai ulasan orang lain.

MEMPERBARUI

Kode di atas adalah untuk CherryPy 2.X, CherryPy 3.Xyang server.quickstartmetode telah dihapus dan engine.starttidak mengambil blockingbendera. Jadi, jika Anda menggunakanCherryPy 3.X

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.engine.start()
sanxiyn
sumber
3
tetapi apakah itu hanya untuk cherrypy, bagaimana menggunakannya dengan skrip sinple?
Anurag Uniyal
13
Ini bukan untuk CherryPy. Pikirkan CherryPy sebagai toolkit GUI.
sanxiyn
1
fwiw, halaman pysizer pysizer.8325.org tampaknya merekomendasikan heapy, yang katanya mirip
Jacob Gabrielson
6
Ada port WSGI generik dari Dowser yang disebut Dozer, yang dapat Anda gunakan dengan server web lain juga: pypi.python.org/pypi/Dozer
Joe Shaw
2
cherrypy 3.1 menghapus cherrypy.server.quickstart (), jadi gunakan saja cherrypy.engine.start ()
MatsLindh
66

Pertimbangkan perpustakaan objgraph (lihathttp://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks untuk contoh kasus penggunaan).

Charles Duffy
sumber
7
objgraph membantu saya memecahkan masalah kebocoran memori yang saya hadapi hari ini. objgraph.show_growth () sangat berguna
Ngure Nyaga
1
Saya juga menemukan objgraph sangat berguna. Anda dapat melakukan hal-hal seperti objgraph.by_type('dict')memahami dari mana semua dictbenda tak terduga itu berasal.
dino
18

Muppy adalah (yang lain) Memory Usage Profiler untuk Python. Fokus dari perangkat ini diletakkan pada identifikasi kebocoran memori.

Muppy mencoba membantu pengembang untuk mengidentifikasi kebocoran memori aplikasi Python. Ini memungkinkan pelacakan penggunaan memori selama runtime dan identifikasi objek yang bocor. Selain itu, alat disediakan yang memungkinkan untuk menemukan sumber objek yang tidak dirilis.

Serrano
sumber
13

Saya sedang mengembangkan memory profiler untuk Python yang disebut memprof:

http://jmdana.github.io/memprof/

Ini memungkinkan Anda untuk mencatat dan memplot penggunaan memori variabel Anda selama eksekusi metode yang didekorasi. Anda hanya perlu mengimpor perpustakaan menggunakan:

from memprof import memprof

Dan hiasi metode Anda menggunakan:

@memprof

Ini adalah contoh bagaimana plot terlihat:

masukkan deskripsi gambar di sini

Proyek ini dihosting di GitHub:

https://github.com/jmdana/memprof

jmdana
sumber
3
Bagaimana saya menggunakannya? Apa itu a, b, c?
tommy.carstensen
@ tommy.carstensen a, bdan cadalah nama-nama variabel. Anda dapat menemukan dokumentasinya di github.com/jmdana/memprof . Jika Anda memiliki pertanyaan, jangan ragu untuk mengirimkan masalah di github atau mengirim email ke milis yang dapat ditemukan dalam dokumentasi.
jmdana
12

Saya menemukan meliae jauh lebih fungsional daripada Heapy atau PySizer. Jika Anda menjalankan websi wsgi, Dozer adalah pembungkus middleware Dowser yang bagus

Calen Pennington
sumber
8

Coba juga proyek pytracemalloc yang menyediakan penggunaan memori per nomor baris Python.

EDIT (2014/04): Sekarang memiliki Qt GUI untuk menganalisis foto.

haypo
sumber
4
tracemallocsekarang menjadi bagian dari pustaka standar python. Lihat docs.python.org/3/library/tracemalloc.html
Dan Milon