Kasutage neid näpunäiteid, et analüüsida oma koodi ja leida, kus see on kõige tõhusam või kõige vähem tõhus.

Kuna Pythonis on "selleks on rohkem kui üks viis", võib mõne ülesande jaoks kõige mälutõhusama lähenemisviisi leidmine olla keeruline. Siin saab aidata mäluprofiili koostaja. Lisaks lekete jälgimisele aitab teie koodi mäluprofiili hindamine määrata, milline kood on mälutõhus.

Olenemata sellest, kas arendate Pythoni abil masinõppemudelit või veebisaiti, saate hinnata skriptide, üksikute koodiridade või funktsioonide mäluprofiili.

Kogu koodibaasi mäluprofiili hindamine võib olla ebapraktiline, kuna see võib teie rakendust oluliselt aeglustada. Selle asemel on parem profileerida valikuliselt funktsioone või meetodeid, mille puhul arvate, et need võivad rohkem mälu tarbida. Kuid isegi kui soovite seda teha kogu rakenduse jaoks, võiksite pühendada selle käsitlemiseks eraldatud mooduli.

Pythonis on palju profiiliteeke. Mõned kõige populaarsemad on mälu_profiil, psutil, Tracemalloc, ja pümpler. See õpetus kasutab mälu_profiil ja psutil.

instagram viewer

Kuigi psutil on ideaalne meetodi või funktsiooni täitmise kogumälukulu hindamiseks, mälu_profiil annab üksikasjalikumat teavet mälukasutuse kohta, sealhulgas reahaaval ja funktsionaalse taseme kasutustrende aja jooksul.

Alustamiseks installige mälu_profiil oma Pythoni virtuaalsesse keskkonda. See installib ka psutil.

pip install memory_profiler

Hankige mälus oleva objekti suurus

Saate alustada mäluprofiilide koostamist, arvutades esmalt välja objekti suuruse, mida kavatsete mälus kasutada.

Seda tüüpi profiilide koostamine on abiks arenduse alguses, kui proovite määrata, millist objekti tüüpi programmis kasutada.

Näiteks kui jääte jänni, otsustades, milliseid meetodeid ülesande täitmiseks kasutada, näiteks sobivat Pythoni andmetüüp, saate iga faili suuruse baitides, et määrata, milline on teie jaoks kergem juhtum.

The sys.getsizeof Sisseehitatud meetod on kasulik siin:

importida sys
print(f" loendi suurus: {sys.getsizeof([])} baiti")
print(f"sõnastiku suurus: {sys.getsizeof (dict)} baiti")
print(f"-korruse suurus: {sys.getsizeof(())} baiti")
print(f"määratud suurus: {sys.getsizeof({})} baiti")

Siin on väljund:

Võite kasutada ka sys.getsizeof meetod sisseehitatud ja kohandatud funktsiooni mälumahu võrdlemiseks.

Näiteks võrrelge seda kohandatud pikkuse funktsiooni kasutab Pythoni silmust koos sisseehitatud len funktsioon:

importida sys

defgetLength(itereeritav):
arv = 0

jaoks i sisse itereeritav:
loe +=1

tagasi loendama

print(f"Sisseehitatud pikkuse funktsioon: {sys.getsizeof (len)} baiti")
print(f"Kohandatud pikkuse funktsioon: {sys.getsizeof (getLength)} baiti")

Ülaltoodud kood annab järgmise väljundi:

Samas samal ajal sys.getsizeof mõõdab objekti suurust mälus, võtab arvesse ainult objekti ennast, mitte sellele viitavaid. Selleks vajate üksikasjalikumat profileerimismeetodit.

Leidke Pythoni funktsiooni mäluprofiil

Funktsiooni iga koodirea kohta saate üksikasjalikuma mäluprofiili, kasutades mälu_profiil pakett. See hõlmab lisamist @profiil dekoraator teie funktsiooni või meetodiga:

import pandad
import numpy
mälu_profiili impordiprofiilist

klassi manipuleerimine:
@profiil
def manipulateData (ise):
df = pandad. 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='täitmine', inplace=True)
return str (df)

manip = Manipuleeri ()
print (manip.manipulateData())

Ülaltoodud kood annab funktsiooni iga koodirea üksikasjaliku mäluprofiili, nagu näidatud:

The Mälu kasutamine veerg näitab konkreetse koodirea mälukasutust, samas kui Kasv veerus on näidatud iga rea ​​lisakulud. The Esinemine veerg määrab, mitu korda koodirida mälu eraldab või eraldab.

Näiteks ülaltoodud väljundis esines rida 11 kaks korda mälu juurdekasvuga 0,1 MiB (Mebibait), suurendades mälukasutust 55,4 MiB-ni. Liinid 19 ja 22 andsid samuti vastavalt 0,2 MiB ja 0,3 MiB, kokku kasutas mälu 55,9 MiB.

Leidke ajatempli järgi Pythoni skripti mäluprofiil

Samuti saate hinnata kogu Pythoni skripti mäluprofiili, kasutades mälu_profiil käivitades mprof käsk terminalis, nagu näidatud:

mprof käivitage script_name.py

Ülaltoodud käsk proovib määratud skripti iga 0,1 sekundi järel ja loob automaatselt a .dat faili oma praeguses projektikataloogis.

Arvud, mis järgnevad MEM tähistus on Pythoni skripti mälukasutusprofiilid teatud ajavahemike järel. Viimased paremal olevad numbrid tähistavad ajatemplit, mille profileerija iga mälukasutuse jaoks jäädvustas.

Saate hankida ka mäluprofiili graafiku. See nõuab installimist matplotlib:

pip installi matplotlib

Pärast installimist käivitage mprof käsk nii:

mprof krunt

Siin on antud juhul väljund:

Käivitage skripti mäluprofiil spetsiaalses Pythoni failis

Võib-olla soovite luua profiili erinevate Pythoni skriptide jaoks. Sa suudad seda kasutades selleks spetsiaalset Pythoni moodulit Pythoni kaudu alamprotsess.

Nii saate eraldada oma mäluprofiili koodibaasist ja salvestada graafiku väljundi lokaalselt:

importida alamprotsess

subprocess.run([
"mprof", 'jookse', "--kaasa-lapsed", 'missing.py'
])

# salvestage joonise väljund kohapeal
subprocess.run(["mprof", 'süžee', "--output=output.jpg"])

Skripti mäluprofiili käitamiseks peate käivitama ainult ülaltoodud koodi sisaldava Pythoni faili. See loob mäluprofiili graafiku (väljund.jpg) failikataloogis:

Funktsiooni täitmisel kasutatud mälumahu leidmine

Meetodi või funktsiooni kogumäluprofiili leiate täitmise ajal, kasutades psutil pakett.

Näiteks eelmise profiili tegemiseks Pandas DataFrame'i manipuleerimine meetod teises Pythoni failis:

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

# importige teie meetodit sisaldav klass
alates mingi kood.puuduvad importida Manipuleerida

# instantseerige klass
manip = Manipuleeri ()

protsess = psutil. Protsess (os.getpid())
esialgne_mälu = process.memory_info().rss

# käivitage sihtmeetod:
manip.manipulateData()

# hankige mäluteave pärast täitmist
final_memory = process.memory_info().rss
mälu_kulu = lõplik_mälu – esialgne_mälu
memory_consumed_mb = mälu_kulu / (1024 * 1024)
print(f"Funktsiooni poolt kulutatud mälu: {memory_consumed_mb:.2f} MB")

Ülaltoodud hinnangul on meetodi kogumäluprofiil megabaitides (MB), nagu näidatud:

Leidke Jupyteri sülearvutist koodirea mäluprofiil

Kui kasutate Jupyteri sülearvutis iPythonit, saate ühe voodri mäluprofiili arvutada, kasutades mälu_profiil. Peate ainult laadima mälu_profiil ühes lahtris. Seejärel lisage %memit maagiline funktsioon teie koodile järgmistes lahtrites; see tagastab koodi tippmälu ja suurendatud suuruse.

See meetod ei tööta tavaliste Pythoni skriptidega peale iPythoni Jupyteri sülearvutis.

Näiteks:

Võite kasutada ka %memit magic funktsioon Jypyter Notebookis funktsiooni mälu profileerimiseks käitusajal:

Parandage oma Pythoni koodis mälutõhusust

Arvestades raskeid andmete tõstmise ülesandeid, mille jaoks Pythonit sageli kasutame, vajab iga koodirida mälukasutuse haldamiseks piisavat optimeerimist. Kuigi Pythonil on palju sisseehitatud Pythoni funktsioone, põhjustavad viitamata objektid mälulekkeid.

Kui olete mälukasutust arvestamata jätnud iga töötava Pythoni süntaksi teie koodibaasi, võiksite enne liiga kaugele minekut tagasi vaadata.