Pomocí těchto tipů analyzujte svůj kód a zjistěte, kde je to nejúčinnější nebo nejméně efektivní.

Vzhledem k tomu, že v Pythonu „existuje více způsobů, jak to udělat“, může být nalezení nejefektivnějšího přístupu k paměti pro některé úlohy náročné. Zde může pomoci paměťový profiler. Kromě sledování úniků pomáhá odhad paměťového profilu vašeho kódu určit, který kód je paměťově efektivní.

Ať už vyvíjíte model strojového učení nebo web s Pythonem, můžete odhadnout paměťový profil pro skripty, jednotlivé řádky kódu nebo funkce.

Odhadování paměťového profilu celé vaší kódové základny může být nepraktické, protože to může výrazně zpomalit vaši aplikaci. Nejlepší je selektivně profilovat funkce nebo metody, o kterých se domníváte, že mohou spotřebovávat více paměti. Ale i když to chcete udělat pro celou vaši aplikaci, možná budete chtít vyhradit izolovaný modul, který to zvládne.

V Pythonu je mnoho knihoven profilování. Některé z nejoblíbenějších jsou paměťový_profil, psutil, Tracemalloc, a pympler. Tento tutoriál používá paměťový_profil a psutil.

instagram viewer

Zatímco psutil je ideální pro odhad celkové spotřeby paměti při provádění metody nebo funkce, paměťový_profil poskytuje podrobnější informace o využití paměti, včetně trendů využití po jednotlivých řádcích a funkčních úrovní v průběhu času.

Chcete-li začít, nainstalujte paměťový_profil do vašeho virtuálního prostředí Pythonu. Toto se také nainstaluje psutil.

pip install memory_profiler

Získejte velikost objektu v paměti

Profilování paměti můžete zahájit tak, že nejprve spočítáte velikost objektu, který hodláte použít v paměti.

Tento typ profilování je užitečný na začátku vývoje – při pokusu určit, který typ objektu použít v programu.

Pokud se například zaseknete při rozhodování, jaké metody použít k dosažení úkolu, řekněme, vhodné Python datový typ, můžete získat velikost každého v bajtech a určit, který je pro vaše použití lehčí pouzdro.

The sys.getsizeof vestavěná metoda se hodí zde:

import sys
tisk(f" velikost seznamu: {sys.getsizeof([])} bajtů")
tisk(f"velikost slovníku: {sys.getsizeof (diktát)} bajtů")
tisk(f" velikost n-tice: {sys.getsizeof(())} bajtů")
tisk(f" velikost sady: {sys.getsizeof({})} bajtů")

Zde je výstup:

Můžete také použít sys.getsizeof metoda pro porovnání velikosti paměti vestavěné a vlastní funkce.

Porovnejte například tuto funkci vlastní délky používá smyčku Python for s vestavěným len funkce:

import sys

defgetLength(opakovatelné):
počítat = 0

pro i v iterovatelné:
počítat +=1

vrátit se počet

tisk(f"Vestavěná funkce délky: {sys.getsizeof (len)} bajtů")
tisk(f" Funkce vlastní délky: {sys.getsizeof (getLength)} bajtů")

Výše uvedený kód poskytuje následující výstup:

Nicméně, zatímco sys.getsizeof měří velikost objektu v paměti, zohledňuje pouze objekt samotný a ne ty, které na něj odkazují. K tomu budete potřebovat podrobnější metodu profilování.

Najděte profil paměti funkce Pythonu

Můžete získat podrobnější paměťový profil každého řádku kódu funkce pomocí paměťový_profil balík. To zahrnuje přidání @profil dekoratér k vaší funkci nebo metodě:

importovat pandy
import numpy
z profilu importu memory_profiler

třída Manipulovat:
@profil
def manipulateData (vlastní):
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)
vrátit str (df)

manip = Manipulovat()
tisknout (manip.manipulateData())

Výše uvedený kód poskytuje podrobný profil paměti každého řádku kódu ve funkci, jak je znázorněno:

The Využití paměti sloupec označuje využití paměti pro konkrétní řádek kódu, zatímco sloupec Přírůstek sloupec ukazuje režii přidanou každým řádkem. The Výskyt sloupec definuje, kolikrát řádek kódu alokuje nebo uvolňuje paměť.

Například ve výše uvedeném výstupu se řádek 11 vyskytl dvakrát s přírůstkem paměti o 0,1 MiB (Mebibyte), čímž se využití paměti zvýšilo na 55,4 MiB. Linky 19 a 22 také přispěly 0,2 MiB a 0,3 MiB, v tomto pořadí, což představuje celkové využití paměti na 55,9 MiB.

Najděte profil paměti skriptu Python podle časového razítka

Můžete také odhadnout paměťový profil celého skriptu Python pomocí paměťový_profil spuštěním mprof příkaz v terminálu, jak je znázorněno:

mprof spusťte script_name.py

Výše uvedený příkaz vzorkuje zadaný skript každých 0,1 s a automaticky vytvoří a .dat soubor ve vašem aktuálním projektovém adresáři.

Čísla, která následují MEM notace jsou profily využití paměti skriptu Python v určitém časovém intervalu. Poslední číslice vpravo představují časové razítko, které profiler zachytil pro každé využití paměti.

Můžete také získat graf paměťového profilu. To vyžaduje instalaci matplotlib:

pip instalace matplotlib

Po instalaci spusťte mprof příkaz takto:

mprof pozemek

Zde je výstup v tomto případě:

Spusťte profil paměti skriptu ve vyhrazeném souboru Python

Možná budete chtít vytvořit profil pro různé skripty Pythonu. Můžeš to udělat pomocí vyhrazeného modulu Python přes Python podproces.

Tímto způsobem můžete oddělit svůj profilovač paměti od základny kódu a uložit výstup grafu lokálně:

import podproces

subprocess.run([
'mprof', 'běh', '--zahrnout-děti', 'missing.py'
])

# lokálně uložit výstup plotru
subprocess.run(['mprof', 'spiknutí', '--output=output.jpg'])

Chcete-li spustit paměťový profil skriptu, stačí spustit soubor Python obsahující výše uvedený kód. Tím se vygeneruje graf profilu paměti (výstup.jpg) v adresáři souborů:

Najděte množství paměti použité při provádění funkce

Celkový paměťový profil metody nebo funkce během provádění můžete najít pomocí psutil balík.

Například pro profilování předchozího Manipulace s datovým rámcem Pandas metoda uvnitř jiného souboru Pythonu:

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

# importujte třídu obsahující vaši metodu
z nějaký kód.chybí import Manipulovat

# vytvořit instanci třídy
manip = Manipulovat()

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

# spusťte cílovou metodu:
manip.manipulateData()

# získat informace o paměti po provedení
final_memory = process.memory_info().rss
memory_consumed = final_memory - počáteční_paměť
memory_consumed_mb = memory_consumed / (1024 * 1024)
tisk(f"Paměť spotřebovaná funkcí: {memory_consumed_mb:.2F} MB")

Výše uvedené odhaduje celkový paměťový profil metody v megabajtech (MB), jak je znázorněno:

Najděte paměťový profil řádku kódu v Jupyter Notebooku

Pokud používáte iPython v Jupyter Notebooku, můžete vypočítat paměťový profil jednolinkové linky pomocí paměťový_profil. Stačí jen načíst paměťový_profil v jedné buňce. Poté přidejte %memit magická funkce do vašeho kódu v následujících buňkách; tím se vrátí špičková paměť kódu a zvýšená velikost.

Tato metoda nefunguje s běžnými Python skripty kromě iPythonu v Jupyter Notebooku.

Například:

Můžete také použít %memit magická funkce v Jypyter Notebook pro profilování paměti funkce za běhu:

Zlepšete efektivitu své paměti v kódu Python

Vzhledem k náročným úlohám zvedání dat, pro které často používáme Python, potřebuje každý řádek kódu adekvátní optimalizaci pro správu využití paměti. Zatímco Python obsahuje mnoho vestavěných funkcí Pythonu, nereferencované objekty vedou k únikům paměti.

Pokud jste vypouštěli každou syntaxi Pythonu, která funguje ve vaší kódové základně, aniž byste brali v úvahu využití paměti, možná se budete chtít ohlédnout, než zajdete příliš daleko.