Top 5 Python Memory Profilers

conform sondajului Stackoverflow din 2019, limbajul de programare Python a obținut aprobarea de 73,1% în rândul dezvoltatorilor. Se situează pe locul doi după rugină și continuă să domine în știința datelor și învățarea automată(ML).

Python este favoritul dezvoltatorilor. Este un limbaj de nivel înalt cunoscut pentru robustețea și filozofia sa de bază―simplitatea asupra complexității. Cu toate acestea, performanța aplicației Python este o altă poveste. La fel ca orice altă aplicație, are partea sa de probleme de performanță.

de cele mai multe ori, instrumentele APM, cum ar fi Retrace, pot ajuta la rezolvarea problemelor de performanță ale aplicațiilor. Dar, ce se întâmplă dacă aplicația dvs. Python rulează de patru ore și serverul nu mai are memorie? Aceasta este o problemă specifică care implică resurse de memorie.

se numește scurgere de memorie. Dezvoltatorii trebuie să găsească vinovatul. Acesta este momentul în care vine Python memory profilers.

să explorăm mai departe.

ce sunt Profilerele de memorie Python?

aplicațiile de profilare implică întotdeauna probleme precum CPU, memorie etc. Cu toate acestea, aplicațiile Python sunt predispuse la probleme de gestionare a memoriei. Acest lucru se datorează în primul rând faptului că Python este aplicat aplicațiilor Data Science și ML și funcționează cu cantități mari de date. De asemenea, Python se bazează în mod implicit pe sistemul său de gestionare a memoriei, în loc să îl lase utilizatorului.

deoarece codul Python funcționează în containere printr-un cadru de procesare distribuit, fiecare container conține o cantitate fixă de memorie. Dacă execuția codului depășește limita de memorie, atunci containerul se va termina. Acesta este momentul în care dezvoltarea întâmpină erori de memorie.

cu toate acestea, nu este întotdeauna cazul. Există cazuri în care dezvoltatorii nu știu ce se întâmplă. Poate că un obiect atârnă de o referință atunci când nu ar trebui să fie și se acumulează în timp. Odată ce atinge apogeul, apar probleme de memorie.

soluția quick-fix este de a crește alocarea de memorie. Cu toate acestea, nu este practic, deoarece acest lucru poate duce la o risipă de resurse. De asemenea, poate pune în pericol stabilitatea aplicației din cauza vârfurilor de memorie imprevizibile.

prin urmare, avem nevoie de ajutorul profilerilor de memorie Python. Scopul Python memory profilers este de a găsi scurgeri de memorie și de a optimiza utilizarea memoriei în aplicațiile Python. Aceste tipuri de profiluri de memorie Python înțeleg eficiența spațială a codului și a pachetelor utilizate.

Top Python Memory Profilers

deși Python gestionează automat memoria, are nevoie de instrumente, deoarece lucrările Python de lungă durată consumă multă memorie. În majoritatea cazurilor, aceste lucrări nu vor returna memoria în sistemul de operare până la terminarea procesului, chiar dacă execută corect colectarea gunoiului.

aici este o listă de profiluri de memorie Python cunoscute:

Pympler

Jean Brouwers, Ludwig Haehne și Robert Schuppenies au construit Pympler în August 2008. Ei au introdus procesul de pympling, în care Pympler obține detalii despre dimensiunea și durata de viață a obiectelor Python.

Pympler Python memory profiler analizează comportamentul de memorie al obiectului Python în interiorul unei aplicații care rulează. Acesta oferă o soluție completă și stand-alone Python profilare de memorie. De asemenea, proiectează o posibilă eroare în comportamentul de rulare, cum ar fi umflarea memoriei și alte „pymples.”

există trei module separate în interiorul Pympler.

  • modulul asizeof furnizează informații despre dimensiunea obiectului Python.
  • modulul muppy se adresează monitorizării on-line a unei aplicații Python.
  • modulul class Tracker oferă o analiză off-line a duratei de viață a obiectelor Python selectate.

în primul rând, să folosim asizeof pentru a investiga câtă memorie consumă anumite obiecte Python.

>>> from pympler import asizeof

>>> obj =

>>> asizeof.asizeof(obj)

>>> print (asizeof.asized(obj, detail=1).format())

size=192 flat=48

(6, 4) size=64 flat=32

‘i’ size=32 flat=32

3 size=16 flat=16

2 size=16 flat=16

1 size=16 flat=16

În al doilea rând, să pună în aplicare modulul muppy:

>>> din import pympler muppy

>>> allobjects = muppy.get_objects()

>>> len(allObjects)

>>> din rezumatul importului pympler

>>> i = rezumat.rezumați (allObjects)

>>> rezumat.print_(sum)

types | # objects | total size
========================== | =========== | ============
str | 13262 | 1.01 MB
dict | 2120 | 659.99 KB
code | 3362 | 343.73 KB
list | 2587 | 247.46 KB
type | 639 | 242.61 KB
tuple | 2069 | 58.83 KB
set | 86 | 44.57 KB
wrapper_descriptor | 1247 | 43.84 KB
builtin_function_or_method | 1014 | 35.65 KB
method_descriptor | 937 | 32.94 KB
abc.ABCMeta | 66 | 32.38 KB
weakref | 818 | 28.76 KB
int | 1612 | 24.72 KB
getset_descriptor | 555 | 17.34 KB
frozenset | 90 | 16.87 KB

aici, puteți vizualiza toate obiectele Python într-o grămadă folosind modulul muppy. Puteți apela un alt rezumat și îl puteți compara pentru a verifica dacă unele matrice au scurgeri de memorie. Aflați mai multe despre modulul muppy aici.

al treilea modul din profilerul Pympler este trackerul de clasă. Urmărește durata de viață a obiectelor din anumite clase. Thus, it provides insight into instantiation patterns and helps developers understand how specific objects contribute to the memory footprint in the long run.

>>> tr = classtracker.ClassTracker()

>>> tr.track_class(Document)

>>> tr.create_snapshot(description=’Snapshot 1′)

>>> doc = create_document()

>>> tr.create_snapshot(description=’Snapshot 2′)

>>> tr.stats.print_summary()

— rezumat ———————-

instantaneu 1 activ 0 b pct mediu

instantaneu 2 activ 0 b pct mediu

—————————

pentru a afla mai multe despre class Tracker, click aici.

Guppy3

Guppy3 (cunoscut și sub numele de Heapy) este un mediu de programare Python și un set de instrumente de analiză heap. Este un pachet care conține următoarele sub-pachete:

  • etc – Acesta este un modul de suport care are modulul de protocol lipici.
  • gsl – subpachetul care conține implementarea limbajului de specificație Guppy. Creează documente și teste dintr-o sursă comună.
  • heapy – setul de instrumente de analiză heap oferă informații obiect despre heap și afișează informațiile.
  • seturi – aceasta conține seturi de biți și seturi de noduri.

Guppy3 este o furculiță de Guppy-PE și a fost construit de Sverker Nilsson pentru Python 2.

Notă: Utilizarea acestui Profiler de memorie Python necesită Python 3.5, 3.6, 3.7 sau 3.8. Acest pachet funcționează numai pentru CPython. Prin urmare, PyPy și alte implementări de compilatoare Python nu sunt acceptate. De asemenea, pentru a utiliza browserul grafic, are nevoie de Tkinter. În plus, filetarea trebuie să fie disponibilă atunci când utilizați un monitor la distanță.

Iată cum să profitați de acest Profiler de memorie Python. Puteți face un instantaneu al grămezii înainte și după un proces critic. Apoi comparați memoria totală și identificați posibilele vârfuri de memorie implicate în obiectele obișnuite.

>>> from guppy import hpy

>>> h=hpy()

>>> h.heap()

Partition of a set of 34090 objects. Total size = 2366226 bytes.

Index Count % Size % Cumulative % Kind (class / dict of class)
0 10279 30 666873 28 666873 28 str
1 4697 14 259576 11 926449 39 bytes
2 2413 7 251684 11 1178133 50 types.CodeType
3 6825 20 238084 10 1416217 60 tuple
4 448 1 174868 7 1591085 67 type
5 2208 6 150144 6 1741229 74 function
6 448 1 130964 6 1872193 79 dict of type
7 94 0 83532 4 1955725 83 dict of module
8 242 1 56524 2 2012249 85 dict (no owner)
9 1133 3 40788 2 2053037 87 types.WrapperDescriptorType

<118 more rows. Type e.g. ‘_.more’ to view.>

Memory Profiler

Memory Profiler is a pure Python module that uses the psutil module. Acesta monitorizează consumul de memorie al unui proces de locuri de muncă Python. De asemenea, efectuează o analiză linie cu linie a consumului de memorie al aplicației.

modul de utilizare a memoriei linie cu linie funcționează în același mod ca line_profiler.

  1. decorează funcția pe care doriți să o profilați folosind funcția @profile.
  2. puteți rula scriptul cu un script special. De exemplu, utilizați argumente specifice interpretului Python.

în exemplul următor, să avem o funcție simplă numită my_func. Această funcție creează o listă cu un interval specificat.

@profile

def my_func():

a=

for i in range(1000):

a.append(i)

my_func()

This outputs:

Line # Mem Usage Increment Line Contents
1 13.859 MiB 13.859 MiB @profile
2 def my_func():
3 13.859 MiB 0.000 MiB a=
4 13.859 MiB 0.000 MiB pentru i în interval(1000):
5 13,859 MiB 0,000 MiB a.Adăugați(i)

prima coloană este numărul liniei codului profilat. Utilizarea Mem este utilizarea memoriei interpretului Python după fiecare execuție de cod. A treia coloană (Increment) reprezintă diferența de memorie a liniei curente față de ultima. Ultima coloană (conținutul liniei) afișează codurile profilate.

To see how this Python memory profiler works, let’s change the range value to 1000000 in the function above and execute it. Here is the output:

Line # Mem usage Increment Line Contents
1 13.844 MiB 13.844 MiB @profile
2 def my_func():
3 13.844 MiB 0.000 MiB a=
4 33.387 MiB 0.016 MiB pentru i în interval(1000000):
5 33,387 MiB 0,293 MiB a.Adăugați(i)

linia 4 și 5 arată o creștere a utilizării memoriei, dovedind că acest profiler efectuează o analiză linie cu linie a consumului de memorie.

Fil

Fil profiler este un open-source Python profiler de memorie. Este potrivit pentru prelucrarea datelor și aplicații științifice de calcul. În prezent, este încă în stadiul de dezvoltare și rulează numai pe Linux și macOS.

majoritatea oamenilor de știință de date și dezvoltatorilor Python se confruntă cu probleme de memorie cu conducta de date Python. Când folosește prea multă memorie, este dificil să identifici exact unde merge toată memoria.

de exemplu, să cităm două scenarii:

Servere

deoarece serverele rulează non-stop, scurgerile de memorie sunt adesea cauza eșecului de performanță. Dezvoltatorii neglijează cantități mici de scurgeri de memorie, deoarece majoritatea serverelor procesează cantități mici de date la un moment dat. Cu toate acestea, acestea pot adăuga până la zeci de mii de apeluri. Ca urmare, acest lucru ar putea crea probleme grave de producție în timp.

conducte de date

când prelucrați bucăți mari de date, vârfurile de utilizare a memoriei aduc amenințări uriașe conductelor de date. De exemplu, dacă aplicația dvs. folosește 1 GB RAM de ceva timp și apoi are nevoie brusc de 16 GB RAM. Există o mare nevoie de a identifica ceea ce cauzează vârfuri bruște de memorie.

acesta este obiectivul principal Al Fil―de a diagnostica vârfurile de utilizare a memoriei, indiferent de cantitatea de date procesate. Acesta indică exact unde este utilizarea maximă a memoriei și ce cod este responsabil pentru acel vârf.

deși există profiluri de memorie Python existente care măsoară utilizarea memoriei, aceasta are limitări. Una dintre care se ocupă cu cantități mari de prelucrare a datelor―lot. Aplicațiile Python sunt în mare parte aplicații de procesare în lot în care citesc în mod constant date, le procesează și obțin rezultatul.

această problemă este răspunsă de următorul nostru profiler.

Blackfire

pentru un limbaj extrem de dinamic precum Python, majoritatea dezvoltatorilor întâmpină probleme de memorie în timpul implementării. Acest lucru duce la o oarecare confuzie cu privire la ceea ce se întâmplă cu utilizarea memoriei. Dezvoltatorii tind să efectueze optimizări, dar nu au instrumentele potrivite de utilizat.

Blackfire este un profiler de memorie Python proprietar (poate primul. Utilizează Managerul de memorie Python pentru a urmări fiecare bloc de memorie alocat de Python, inclusiv extensiile C. Blackfire este nou în domeniu și își propune să rezolve probleme în scurgerile de memorie, cum ar fi:

  • obiecte mari din memorie care nu sunt eliberate
  • cicluri de referință
  • numărarea referințelor nevalide în extensiile C care provoacă scurgeri de memorie
  • vârfuri bruște de memorie

cu aceste cazuri de utilizare, Blackfire asigură utilizatorilor că are o regie foarte limitată și nu afectează utilizatorii finali, deoarece măsoară consumul de memorie al aplicației Python la nivelul apelului de funcții. Blackfire Python memory profiler folosește API-ul PYMEM_SETALLOCATOR pentru a urmări alocările de memorie precum tracemalloc. În prezent, Blackfire acceptă versiunile Python 3.5 și versiuni ulterioare. Puteți vizita site-ul său pentru a afla mai multe.

profilarea cu Retrace

dacă lucrați cu Python, cumva experimentați că nu eliberează imediat memoria înapoi în sistemul de operare. Prin urmare, îl rulați într-un proces separat pentru a vă asigura că memoria este eliberată după executarea unei bucăți de cod. Acest lucru se face printr-o abordare utilă numită „caz de testare mic.”Acest proces permite rularea numai a codului de scurgere a memoriei în cauză.

când aveți de-a face cu cantități mari de date, utilizați un subset de date eșantionate aleatoriu. De asemenea, executați sarcini intensive în memorie în procese separate și utilizați depanatoare pentru a adăuga referințe la obiecte. Cu toate acestea, luați în considerare faptul că utilizarea unui debugger breakpoint, cum ar fi pdb, permite ca orice obiecte create și la care se face referire manual din debugger să rămână în profilul de memorie. Acest lucru va duce la un fals sentiment de scurgeri de memorie, deoarece obiectele nu sunt eliberate la timp. În plus, luați în considerare căutarea pachetelor care pot fi scurgeri. Există biblioteci Python care ar putea avea scurgeri de memorie.

până acum, știți deja cum funcționează Profilerele de memorie Python și problemele comune de memorie cu Python. Dar instrumente precum Retrace cu logare centralizată, urmărirea erorilor și profilarea codului vă pot ajuta să diagnosticați problemele Python la o scară mai mare. Retrace de la Stackify vă va ajuta să se ocupe de orice fel de capcane de performanță și să păstreze codul rulează bine.

începeți procesul gratuit de Retrace de 14 zile astăzi!

Lasă un răspuns

Adresa ta de email nu va fi publicată.