Käytä näitä vinkkejä analysoidaksesi koodisi ja selvittääksesi, missä se on tehokkain tai huonoin.
Koska Pythonissa "on useampi kuin yksi tapa tehdä se", muistia tehokkaimman lähestymistavan löytäminen joihinkin tehtäviin voi olla haastavaa. Tässä muistiprofiili voi auttaa. Vuotojen jäljittämisen lisäksi koodisi muistiprofiilin arvioiminen auttaa määrittämään, mikä koodi on muistitehokas.
Olitpa kehittämässä koneoppimismallia tai verkkosivustoa Pythonilla, voit arvioida komentosarjojen, yksittäisten koodirivien tai funktioiden muistiprofiilin.
Koko koodikannan muistiprofiilin arvioiminen saattaa olla epäkäytännöllistä, koska se voi hidastaa sovellusta merkittävästi. On parasta profiloida valikoivasti toimintoja tai menetelmiä, joiden epäilet kuluttavan enemmän muistia. Mutta vaikka haluaisit tehdä tämän koko sovelluksellesi, saatat haluta omistaa erillisen moduulin käsittelemään sitä.
Pythonissa on monia profilointikirjastoja. Jotkut suosituimmista ovat muisti_profiili, psutil, Tracemalloc, ja pympler. Tämä opetusohjelma käyttää muisti_profiili ja psutil.
Sillä aikaa psutil on ihanteellinen menetelmän tai funktion suorituksen kokonaismuistinkulutuksen arvioimiseen, muisti_profiili antaa yksityiskohtaisempia muistinkäyttötietoja, mukaan lukien rivikohtaiset ja toiminnalliset käyttötrendit ajan mittaan.
Aloita asentamalla muisti_profiili Python-virtuaaliympäristöösi. Tämä myös asentaa psutil.
pip install memory_profiler
Hanki muistissa olevan esineen koko
Voit aloittaa muistin profiloinnin laskemalla ensin muistissa käytettävän objektin koon.
Tämän tyyppisestä profiloinnista on apua kehityksen alussa – kun yritetään määrittää, mitä objektityyppiä ohjelmassa käytetään.
Jos esimerkiksi jäät jumiin päättäessäsi, mitä menetelmiä käyttää tehtävän suorittamiseen, sanotaanko sopivaa Python-tietotyyppi, voit saada kunkin koon tavuina määrittääksesi, mikä on kevyempi käyttöösi tapaus.
The sys.getsizeof sisäänrakennettu menetelmä on hyödyllinen tässä:
tuonti sys
Tulosta(f"listan koko: {sys.getsizeof([])} tavua")
Tulosta(f"sanakirjan koko: {sys.getsizeof (dict)} tavua")
Tulosta(f"-koko: {sys.getsizeof(())} tavua")
Tulosta(f" asetettu koko: {sys.getsizeof({})} tavua")
Tässä tulos:
Voit myös käyttää sys.getsizeof menetelmä, jolla verrataan sisäänrakennetun ja mukautetun toiminnon muistin kokoa.
Vertaa esimerkiksi tätä mukautettua pituusfunktiota käyttää Python for silmukkaa sisäänrakennetun kanssa len toiminto:
tuonti sys
defgetLength(iteroitavissa):
laske = 0varten i sisään iteroitavissa:
laske +=1palata Kreivi
Tulosta(f"Sisäänrakennettu pituustoiminto: {sys.getsizeof (len)} tavua")
Tulosta(f"Mukautettu pituusfunktio: {sys.getsizeof (getLength)} tavua")
Yllä oleva koodi antaa seuraavan tulosteen:
Kuitenkin samalla sys.getsizeof mittaa objektin koon muistissa, se ottaa huomioon vain itse objektin, ei siihen viittaavia. Tätä varten tarvitset yksityiskohtaisemman profilointimenetelmän.
Etsi Python-funktion muistiprofiili
Voit saada tarkemman muistiprofiilin funktion jokaisesta koodirivistä käyttämällä muisti_profiili paketti. Tämä sisältää lisäämisen @profiili sisustaja toimintosi tai menetelmäsi mukaan:
tuonti pandat
tuonti numpy
muisti_profiilin tuontiprofiilistaluokka Manipuloi:
@profiili
def manipulateData (itse):
df = pandat. Datakehys({
'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äyttö', inplace=True)
paluu str (df)
manip = Manipuloi()
tulosta (manip.manipulateData())
Yllä oleva koodi antaa yksityiskohtaisen muistiprofiilin jokaisesta toiminnon koodirivistä kuvan mukaisesti:
The Muistin käyttö sarake osoittaa muistin käytön tietylle koodiriville, kun taas Lisäys sarake näyttää kunkin rivin lisäkustannukset. The Esiintyminen sarake määrittää, kuinka monta kertaa koodirivi varaa tai vapauttaa muistin.
Esimerkiksi yllä olevassa lähdössä rivi 11 esiintyi kaksi kertaa muistin lisäyksellä 0,1 MiB (Mebibyte), mikä nosti muistin käytön 55,4 MiB: iin. Linjojen 19 ja 22 osuus oli myös 0,2 MiB ja 0,3 MiB, jolloin muistin käyttö oli 55,9 MiB.
Etsi Python-skriptin muistiprofiili aikaleiman avulla
Voit myös arvioida koko Python-skriptin muistiprofiilin käyttämällä muisti_profiili ajamalla mprof komento terminaalissa kuvan mukaisesti:
mprof suorita komentosarjan_nimi.py
Yllä oleva komento ottaa näytteitä määritetystä komentosarjasta 0,1 sekunnin välein ja luo automaattisesti a .dat tiedosto nykyisen projektihakemiston sisällä.
Seuraavat luvut MEM merkinnät ovat Python-komentosarjan muistin käyttöprofiileja tietyllä aikavälillä. Viimeiset oikealla olevat luvut edustavat aikaleimaa, jonka profiloija on kaapannut kullekin muistinkäytölle.
Voit myös saada kaavion muistiprofiilista. Tämä vaatii asennuksen matplotlib:
pip asennus matplotlib
Kun olet asentanut, suorita mprof komento näin:
mprof juoni
Tässä on tulos tässä tapauksessa:
Suorita komentosarjamuistiprofiili erillisessä Python-tiedostossa
Haluat ehkä profiloida erilaisia Python-skriptejä. Sinä pystyt tähän käyttämällä erillistä Python-moduulia Pythonin kautta osaprosessi.
Tällä tavalla voit erottaa muistiprofilaattorisi koodikannasta ja tallentaa kaavion tulosteen paikallisesti:
tuonti osaprosessi
subprocess.run([
"mprof", 'juosta', '--sisällytä-lapset', "missing.py"
])
# tallenna juonen tulos paikallisesti
subprocess.run(["mprof", 'juoni', '--output=output.jpg'])
Komentosarjan muistiprofiilin suorittamiseksi sinun tarvitsee vain suorittaa yllä olevan koodin sisältävä Python-tiedosto. Tämä luo muistiprofiilikaavion (output.jpg) tiedostohakemistossa:
Selvitä funktion suorittamisesta käytetyn muistin määrä
Voit etsiä menetelmän tai funktion kokonaismuistiprofiilin suorituksen aikana käyttämällä psutil paketti.
Esimerkiksi profiloimaan edellistä Pandas DataFrame -manipulaatio menetelmä toisen Python-tiedoston sisällä:
tuonti psutil
tuonti sys
tuonti os
sys.path.append (sys.path[0] + "/..")# tuo menetelmäsi sisältävä luokka
alkaen jokin koodi.puuttuu tuonti Manipuloida# instantoi luokka
manip = Manipuloi()prosessi = psutil. Prosessi (os.getpid())
alkuperäinen_muisti = process.memory_info().rss# suorita kohdemenetelmä:
manip.manipulateData()
# saada muistitiedot suorituksen jälkeen
final_memory = process.memory_info().rss
memory_consumed = lopullinen_muisti - alkuperäinen_muisti
memory_consumed_mb = muisti_kulutus / (1024 * 1024)
Tulosta(f"Funktion käyttämä muisti: {memory_consumed_mb:.2f} MB")
Yllä oleva arvio menetelmän kokonaismuistiprofiilista megatavuina (MB) kuvan mukaisesti:
Etsi koodirivin muistiprofiili Jupyter Notebookista
Jos käytät iPythonia Jupyter Notebookissa, voit laskea yksilinjaisen muistiprofiilin käyttämällä muisti_profiili. Sinun tarvitsee vain ladata muisti_profiili yhdessä solussa. Lisää sitten %memit taikatoiminto koodiisi seuraavissa soluissa; tämä palauttaa koodin huippumuistin ja lisätyn koon.
Tämä menetelmä ei toimi tavallisten Python-skriptien kanssa Jupyter Notebookin iPythonin lisäksi.
Esimerkiksi:
Voit myös käyttää %memit magic-toiminto Jypyter Notebookissa funktion muistin profiloimiseksi suorituksen aikana:
Paranna Python-koodisi muistin tehokkuutta
Ottaen huomioon raskaat tiedonsiirtotehtävät, joihin käytämme usein Pythonia, jokainen koodirivi tarvitsee riittävän optimoinnin muistinkäytön hallitsemiseksi. Pythonissa on monia sisäänrakennettuja Python-toimintoja, mutta viittaamattomat objektit aiheuttavat muistivuotoja.
Jos olet pudottanut jokaisen toimivan Python-syntaksin koodikantaasi ottamatta huomioon muistin käyttöä, sinun kannattaa katsoa taaksepäin ennen kuin menet liian pitkälle.