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_profilerimport 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_profilerMost, hogy a „line_profiler” készen áll, alkalmazhatjuk a „fibonacci” függvényünkre:
%load_ext line_profilerdef 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árafib_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árafib_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.