Pomocou týchto tipov analyzujte svoj kód a zistite, kde je to najúčinnejšie alebo najmenej efektívne.

Keďže v Pythone „je viac ako jeden spôsob, ako to urobiť“, nájdenie pamäťovo najefektívnejšieho prístupu pre niektoré úlohy môže byť náročné. Tu môže pomôcť pamäťový profilovač. Okrem sledovania únikov pomáha aj odhadovanie pamäťového profilu vášho kódu určiť, ktorý kód je pamäťovo efektívny.

Či už vyvíjate model strojového učenia alebo webovú stránku s Pythonom, môžete odhadnúť pamäťový profil pre skripty, jednotlivé riadky kódu alebo funkcie.

Odhadovanie pamäťového profilu celej vašej kódovej základne môže byť nepraktické, pretože to môže výrazne spomaliť vašu aplikáciu. Najlepšie je selektívne profilovať funkcie alebo metódy, o ktorých máte podozrenie, že namiesto toho spotrebúvajú viac pamäte. Ale aj keď to chcete urobiť pre celú vašu aplikáciu, možno budete chcieť vyhradiť izolovaný modul, ktorý to zvládne.

V Pythone je veľa profilovacích knižníc. Niektoré z najpopulárnejších sú pamäťový_profil, psutil, Tracemalloc, a pympler. Tento tutoriál používa pamäťový_profil a psutil.

instagram viewer

Zatiaľ čo psutil je ideálny na odhad celkovej spotreby pamäte pri vykonávaní metódy alebo funkcie, pamäťový_profil poskytuje podrobnejšie informácie o využití pamäte, vrátane trendov využitia jednotlivých riadkov a funkčných úrovní v priebehu času.

Ak chcete začať, nainštalujte pamäťový_profil do vášho virtuálneho prostredia Pythonu. Toto sa aj nainštaluje psutil.

pip install memory_profiler

Získajte veľkosť objektu v pamäti

Profilovanie pamäte môžete spustiť tak, že najprv vypočítate veľkosť objektu, ktorý chcete použiť v pamäti.

Tento typ profilovania je užitočný na začiatku vývoja – pri pokuse určiť, ktorý typ objektu sa má v programe použiť.

Napríklad, ak sa zaseknete pri rozhodovaní, ktoré metódy použiť na dosiahnutie úlohy, povedzme, vhodné Typ údajov Python, môžete získať veľkosť každého v bajtoch, aby ste určili, čo je pre vaše použitie ľahšie prípad.

The sys.getsizeof vstavaná metóda sa hodí tu:

importovať sys
vytlačiť (Veľkosť f" zoznamu: {sys.getsizeof([])} bajtov")
vytlačiť (f"veľkosť slovníka: {sys.getsizeof (diktát)} bajtov")
vytlačiť (f" veľkosť n-tice: {sys.getsizeof(())} bajtov")
vytlačiť (Veľkosť sady f": {sys.getsizeof({})} bajtov")

Tu je výstup:

Môžete tiež použiť sys.getsizeof metóda na porovnanie veľkosti pamäte vstavanej a vlastnej funkcie.

Porovnajte napríklad túto funkciu vlastnej dĺžky používa cyklus Python for so vstavaným len funkcia:

importovať sys

defgetLength(opakovateľné):
počítať = 0

pre i v iterovateľné:
počítať +=1

vrátiť počítať

vytlačiť (f"Vstavaná funkcia dĺžky: {sys.getsizeof (len)} bajtov")
vytlačiť (f"Funkcia vlastnej dĺžky: {sys.getsizeof (getLength)} bajtov")

Vyššie uvedený kód poskytuje nasledujúci výstup:

Avšak, kým sys.getsizeof meria veľkosť objektu v pamäti, berie do úvahy iba samotný objekt a nie tie, ktoré naň odkazujú. Na to budete potrebovať podrobnejšiu metódu profilovania.

Nájdite profil pamäte funkcie Python

Môžete získať podrobnejší profil pamäte každého riadku kódu funkcie pomocou pamäťový_profil balík. To zahŕňa pridanie @profil dekoratér podľa vašej funkcie alebo metódy:

importovať pandy
import numpy
z profilu importu memory_profiler

trieda Manipulovať:
@profil
def manipulateData (self):
df = pandy. DataFrame({
'A' :[0, 3, numpy.nan, 10, 3, numpy.nan],
'B': [numpy.nan, "Pandas", numpy.nan, "Pandas", "Python", "JavaScript"],
})

df.fillna (method='bfill', inplace=True)
df.fillna (method='ffill', inplace=True)
return str (df)

manip = Manipulovať ()
vytlačiť (manip.manipulateData())

Vyššie uvedený kód poskytuje podrobný profil pamäte každého riadku kódu vo funkcii, ako je znázornené:

The Využitie pamäte stĺpec označuje využitie pamäte pre konkrétny riadok kódu, zatiaľ čo stĺpec Prírastok stĺpec zobrazuje réžiu, ktorú prispeje každý riadok. The Výskyt stĺpec definuje, koľkokrát riadok kódu pridelí alebo uvoľní pamäť.

Napríklad vo vyššie uvedenom výstupe sa riadok 11 vyskytol dvakrát s prírastkom pamäte o 0,1 MiB (mebibajt), čím sa využitie pamäte zvýšilo na 55,4 MiB. Riadky 19 a 22 tiež prispeli 0,2 MiB a 0,3 MiB, v uvedenom poradí, čo predstavuje celkové využitie pamäte na 55,9 MiB.

Nájdite profil pamäte skriptu Python podľa časovej pečiatky

Môžete tiež odhadnúť pamäťový profil celého skriptu Python pomocou pamäťový_profil spustením mprof príkaz v termináli, ako je znázornené:

mprof spustite script_name.py

Vyššie uvedený príkaz vzorkuje špecifikovaný skript každých 0,1 s a automaticky vytvorí a .dat súbor vo vašom aktuálnom adresári projektu.

Čísla, ktoré nasledujú po MEM zápis sú profily využitia pamäte skriptu Python v určitom časovom intervale. Posledné číslice vpravo predstavujú časovú pečiatku, ktorú profiler zachytil pre každé využitie pamäte.

Môžete tiež získať graf pamäťového profilu. To si vyžaduje inštaláciu matplotlib:

pip nainštalovať matplotlib

Po nainštalovaní spustite mprof príkaz takto:

mprof pozemok

Tu je výstup v tomto prípade:

Spustite profil pamäte skriptu vo vyhradenom súbore Python

Možno budete chcieť vytvoriť profil pre rôzne skripty Pythonu. Dokážeš to pomocou špeciálneho modulu Python cez Python's podproces.

Týmto spôsobom môžete oddeliť profilovač pamäte od základne kódu a uložiť výstup grafu lokálne:

importovať podproces

subprocess.run([
'mprof', 'beh', '--include-children', 'chýba.py'
])

# lokálne uložiť výstup grafu
subprocess.run(['mprof', 'zápletka', '--output=output.jpg'])

Ak chcete spustiť pamäťový profil skriptu, stačí spustiť súbor Python obsahujúci vyššie uvedený kód. Tým sa vygeneruje graf profilu pamäte (výstup.jpg) v adresári súborov:

Zistite množstvo pamäte použitej pri vykonávaní funkcie

Celkový pamäťový profil metódy alebo funkcie počas vykonávania môžete nájsť pomocou psutil balík.

Napríklad na profilovanie predchádzajúceho Manipulácia Pandas DataFrame metóda v inom súbore Python:

importovať psutil
importovať sys
importovať os
sys.path.append (sys.path[0] + "/..")

# importujte triedu obsahujúcu vašu metódu
od nejaký kód.chýba importovať Manipulovať

# vytvorte inštanciu triedy
manip = Manipulovať ()

proces = psutil. Proces (os.getpid())
initial_memory = process.memory_info().rss

# spustite cieľovú metódu:
manip.manipulateData()

# získať informácie o pamäti po vykonaní
final_memory = process.memory_info().rss
memory_consumed = final_memory - počiatočná_pamäť
memory_consumed_mb = memory_consumed / (1024 * 1024)
vytlačiť (f"Pamäť spotrebovaná funkciou: {memory_consumed_mb:.2f} MB")

Vyššie uvedené odhaduje celkový pamäťový profil metódy v megabajtoch (MB), ako je znázornené:

Nájdite profil pamäte riadku kódu v notebooku Jupyter

Ak používate iPython v Jupyter Notebook, môžete vypočítať pamäťový profil jednovrstvového pamäťový_profil. Potrebujete iba načítať pamäťový_profil v jednej bunke. Potom pridajte % memit magickú funkciu na váš kód v nasledujúcich bunkách; toto vráti špičkovú pamäť kódu a zvýšenú veľkosť.

Táto metóda nefunguje s bežnými Python skriptami okrem iPythonu v Jupyter Notebook.

Napríklad:

Môžete tiež použiť % memit magická funkcia v Jypyter Notebook na profilovanie pamäte funkcie za behu:

Zlepšite svoju pamäťovú efektivitu v kóde Python

Vzhľadom na náročné úlohy zdvíhania údajov, na ktoré často používame Python, každý riadok kódu potrebuje primeranú optimalizáciu na riadenie využitia pamäte. Zatiaľ čo Python obsahuje mnoho vstavaných funkcií Pythonu, nereferencované objekty vedú k úniku pamäte.

Ak ste vypustili každú syntax Pythonu, ktorá funguje vo vašej kódovej základni, bez toho, aby ste zvážili využitie pamäte, možno by ste sa mali pozrieť späť, kým zájdete príliš ďaleko.