Hogyan optimalizálhatja Python kódját profilozó eszközökkel

Hogyan Optimalizalhatja Python Kodjat Profilozo Eszkozokkel



A Python-kód teljesítményének javítása értékes készség a fejlesztők számára. A profilalkotási eszközök ebben az esetben elengedhetetlenek, és megkönnyítik a kódkorlátozások és a hatékonyság hiányának felderítését. Ez a cikk azt vizsgálja, hogyan lehet profilkészítő eszközöket használni a Python programok fejlesztésére. A végrehajtási idők, a memóriafelhasználás és a frekvencia függvényhívások mérésének elsajátításával precízen javíthatunk.

A Python-kód optimalizálása profilozó eszközökkel

A Google Colab beállítása a Python-kód profilalkotási eszközökkel történő optimalizálására, először a Google Colab környezet beállításával kezdjük. Ha újak vagyunk a Colabban, ez egy alapvető, hatékony felhőalapú platform, amely hozzáférést biztosít a Jupyter notebookokhoz és számos Python-könyvtárhoz. A Colab eléréséhez látogassa meg a (https://colab.research.google.com/) webhelyet, és hozzon létre egy új Python-jegyzetfüzetet.

Importálja a profilozó könyvtárakat

Optimalizálásunk a profilozó könyvtárak szakszerű használatán alapul. Ebben az összefüggésben két fontos könyvtár a cProfile és a line_profiler.







import cProfile

import line_profiler

A „cProfile” könyvtár egy beépített Python-eszköz a kód profilozására, míg a „line_profiler” egy külső csomag, amely lehetővé teszi, hogy még mélyebbre menjünk, soronként elemezve a kódot.



Ebben a lépésben létrehozunk egy minta Python-szkriptet a Fibonacci-sorozat kiszámításához egy rekurzív függvény segítségével. Elemezzük ezt a folyamatot alaposabban. A Fibonacci sorozat olyan számok halmaza, amelyben minden egymást követő szám az előtte lévő két szám összege. Általában 0-val és 1-gyel kezdődik, így a sorozat úgy néz ki, mint 0, 1, 1, 2, 3, 5, 8, 13, 21 és így tovább. Ez egy matematikai sorozat, amelyet rekurzív jellege miatt gyakran példaként használnak a programozásban.



A rekurzív Fibonacci-függvényben meghatározunk egy „Fibonacci” nevű Python-függvényt. Ez a függvény egy „n” egész számot vesz fel argumentumként, amely azt a pozíciót jelenti a Fibonacci-sorozatban, amelyet ki szeretnénk számítani. Például meg akarjuk találni az ötödik számot a Fibonacci-sorozatban, ha „n” egyenlő 5-tel.





def fibonacci ( n ) :

Ezután létrehozunk egy alapesetet. A rekurzió alapesete egy olyan forgatókönyv, amely befejezi a hívásokat, és egy előre meghatározott értéket ad vissza. A Fibonacci sorozatban, ha „n” 0 vagy 1, már tudjuk az eredményt. A 0. és 1. Fibonacci szám 0, illetve 1.

ha n <= 1 :

Visszatérés n

Ez az „if” utasítás határozza meg, hogy „n” kisebb-e, vagy egyenlő-e 1-gyel. Ha igen, magát az „n”-t adjuk vissza, mivel nincs szükség további rekurzióra.



Rekurzív számítás

Ha „n” meghaladja az 1-et, akkor folytatjuk a rekurzív számítást. Ebben az esetben meg kell találnunk az „n-edik” Fibonacci-számot az „(n-1)”-edik és az „(n-2)”-edik Fibonacci-számok összegzésével. Ezt úgy érjük el, hogy a függvényen belül két rekurzív hívást végzünk.

más :

Visszatérés fibonacci ( n - 1 ) + fibonacci ( n - 2 )

Itt a „fibonacci(n – 1)” az „(n-1)”-edik Fibonacci-számot, a „fibonacci(n – 2)” pedig az „(n-2)”-edik Fibonacci-számot számítja ki. Összeadjuk ezt a két értéket, hogy megkapjuk a kívánt Fibonacci számot az „n” pozícióban.

Összefoglalva, ez a „fibonacci” függvény rekurzív módon kiszámítja a Fibonacci-számokat úgy, hogy a problémát kisebb részproblémákra bontja. Rekurzív hívásokat hajt végre, amíg el nem éri az alapeseteket (0 vagy 1), ismert értékeket adva vissza. Bármely másik „n” esetén a Fibonacci-számot az „(n-1)” és az „(n-2)” két rekurzív hívás eredményének összegzésével számítja ki.

Bár ez a megvalósítás egyszerű a Fibonacci-számok kiszámításához, nem a leghatékonyabb. A későbbi lépésekben a profilalkotási eszközöket használjuk a teljesítménykorlátozások azonosítására és optimalizálására a jobb végrehajtási idő érdekében.

A kód profilozása a CProfile segítségével

Most profilozzuk a „fibonacci” funkciónkat a „cProfile” használatával. Ez a profilalkotási gyakorlat betekintést nyújt az egyes függvényhívások által elfoglalt időbe.

cprofiler = cProfile. Profil ( )

cprofiler. engedélyezze ( )

eredmény = fibonacci ( 30 )

cprofiler. letiltása ( )

cprofiler. print_stats ( fajta = 'halmozott' )

Ebben a szegmensben inicializálunk egy „cProfile” objektumot, aktiváljuk a profilalkotást, lekérjük a „fibonacci” függvényt „n=30” értékkel, deaktiváljuk a profilalkotást, és megjelenítjük az összesített idő szerint rendezett statisztikákat. Ez a kezdeti profilalkotás magas szintű áttekintést ad arról, hogy mely funkciók igényelik a legtöbb időt.

! pip install line_profiler

import cProfile

import line_profiler

def fibonacci ( n ) :

ha n <= 1 :

Visszatérés n

más :

Visszatérés fibonacci ( n - 1 ) + fibonacci ( n - 2 )

cprofiler = cProfile. Profil ( )

cprofiler. engedélyezze ( )

eredmény = fibonacci ( 30 )

cprofiler. letiltása ( )

cprofiler. print_stats ( fajta = 'halmozott' )

A részletesebb elemzés érdekében a kód soronkénti profiljához a line_profiler segítségével a „line_profiler”-t használjuk a kódunk soronkénti szegmentálására. A „line_profiler” használata előtt telepítenünk kell a csomagot a Colab-tárhelyen.

! pip install line_profiler

Most, hogy a „line_profiler” készen áll, alkalmazhatjuk a „fibonacci” függvényünkre:

%load_ext line_profiler

def fibonacci ( n ) :

ha n <= 1 :

Visszatérés n

más :

Visszatérés fibonacci ( n - 1 ) + fibonacci ( n - 2 )

%lprun -f fibonacci fibonacci ( 30 )

Ez a részlet a „line_profiler” kiterjesztés betöltésével kezdődik, meghatározza a „fibonacci” függvényünket, végül a „%lprun” használatával profilozza a „fibonacci” függvényt „n=30” értékkel. A végrehajtási idők soronkénti szegmentálását kínálja, pontosan tisztázva, hogy a kódunk hol használja az erőforrásait.

Az eredmények elemzéséhez szükséges profilkészítő eszközök futtatása után egy sor statisztika jelenik meg, amely bemutatja kódunk teljesítményjellemzőit. Ezek a statisztikák az egyes funkciókon belül eltöltött teljes időt és az egyes kódsorok időtartamát tartalmazzák. Megkülönböztethetjük például, hogy a Fibonacci-függvény valamivel több időt fordít az azonos értékek többszöri újraszámítására. Ez a redundáns számítás, és ez egy világos terület, ahol az optimalizálás alkalmazható, akár memoizálással, akár iteratív algoritmusok alkalmazásával.

Most olyan optimalizálásokat hajtunk végre, ahol azonosítottunk egy lehetséges optimalizálást a Fibonacci-függvényünkben. Észrevettük, hogy a függvény többször is újraszámítja ugyanazt a Fibonacci-számot, ami szükségtelen redundanciát és lassabb végrehajtási időt eredményez.

Ennek optimalizálása érdekében végrehajtjuk a memoizációt. A memoization egy olyan optimalizálási technika, amely magában foglalja a korábban kiszámított eredmények (jelen esetben Fibonacci-számok) tárolását, és szükség esetén újrafelhasználását az újraszámítás helyett. Ez csökkenti a redundáns számítások számát és javítja a teljesítményt, különösen az olyan rekurzív függvények esetében, mint a Fibonacci-sorozat.

A Fibonacci függvényben a memoizálás megvalósításához a következő kódot írjuk:

# Szótár a kiszámított Fibonacci számok tárolására
fib_cache = { }
def fibonacci ( n ) :
ha n <= 1 :
Visszatérés n
# Ellenőrizze, hogy az eredmény már gyorsítótárban van-e
ha n ban ben fib_cache:
Visszatérés fib_cache [ n ]
más :
# Számolja ki és tárolja el az eredményt
fib_cache [ n ] = fibonacci ( n - 1 ) + fibonacci ( n - 2 )
Visszatérés fib_cache [ n ] ,

A „fibonacci” függvény ezen módosított változatában bevezetünk egy „fib_cache” szótárt a korábban kiszámított Fibonacci-számok tárolására. A Fibonacci-szám kiszámítása előtt ellenőrizzük, hogy az már a gyorsítótárban van-e. Ha igen, akkor a gyorsítótárazott eredményt adjuk vissza. Minden más esetben kiszámoljuk, a gyorsítótárban tároljuk, majd visszaküldjük.

A profilalkotás és optimalizálás megismétlése

Az optimalizálás (esetünkben a memoizálás) végrehajtása után kulcsfontosságú megismételni a profilalkotási folyamatot, hogy megismerjük változtatásaink hatását, és biztosítsuk, hogy javítottuk a kód teljesítményét.

Profilalkotás az optimalizálás után

Ugyanazokat a profilkészítő eszközöket, a „cProfile” és „line_profiler” használhatjuk az optimalizált Fibonacci függvény profilozásához. Az új profilalkotási eredményeket a korábbiakkal összevetve mérhetjük optimalizálásunk eredményességét.

A következőképpen profilozhatjuk az optimalizált „fibonacci” függvényt a „cProfile” segítségével:

cprofiler = cProfile. Profil ( )

cprofiler. engedélyezze ( )

eredmény = fibonacci ( 30 )

cprofiler. letiltása ( )

cprofiler. print_stats ( fajta = 'halmozott' )

A „line_profiler” segítségével soronként profilozzuk:

%lprun -f fibonacci fibonacci ( 30 )

Kód:

# Szótár a kiszámított Fibonacci számok tárolására
fib_cache = { }

def fibonacci ( n ) :
ha n <= 1 :
Visszatérés n
# Ellenőrizze, hogy az eredmény már gyorsítótárban van-e
ha n ban ben fib_cache:
Visszatérés fib_cache [ n ]
más :
# Számolja ki és tárolja el az eredményt
fib_cache [ n ] = fibonacci ( n - 1 ) + fibonacci ( n - 2 )
Visszatérés fib_cache [ n ]
cprofiler = cProfile. Profil ( )
cprofiler. engedélyezze ( )

eredmény = fibonacci ( 30 )

cprofiler. letiltása ( )
cprofiler. print_stats ( fajta = 'halmozott' )
%lprun -f fibonacci fibonacci ( 30 )

A profilalkotási eredmények optimalizálás utáni elemzéséhez jelentősen lerövidül a végrehajtási idő, különösen nagy „n” értékek esetén. A memoizáció miatt megfigyelhető, hogy a függvény most sokkal kevesebb időt tölt a Fibonacci-számok újraszámításával.

Ezek a lépések elengedhetetlenek az optimalizálási folyamatban. Az optimalizálás magában foglalja a kódunkban a profilalkotás során szerzett megfigyelések alapján történő tájékozott módosításokat, míg a profilalkotás ismétlése biztosítja, hogy optimalizálásunk a várt teljesítményjavulást eredményezze. Iteratív profilalkotással, optimalizálással és érvényesítéssel finomhangolhatjuk Python-kódunkat, hogy jobb teljesítményt nyújtsunk, és javítsuk alkalmazásaink felhasználói élményét.

Következtetés

Ebben a cikkben azt a példát tárgyaltuk, amelyben a Python-kódot optimalizáltuk a Google Colab-környezet profilalkotási eszközeivel. Inicializáltuk a példát a beállítással, importáltuk a lényeges profilozó könyvtárakat, megírtuk a mintakódokat, profiloztuk a „cProfile” és a „line_profiler” használatával, kiszámítottuk az eredményeket, alkalmaztuk az optimalizációkat, és iteratív módon finomítottuk a kód teljesítményét.