Kā optimizēt savu Python kodu, izmantojot profilēšanas rīkus

Ka Optimizet Savu Python Kodu Izmantojot Profilesanas Rikus



Python koda veiktspējas uzlabošana ir vērtīga izstrādātāju prasme. Profilēšanas rīki šajā gadījumā ir būtiski, un tie atvieglo koda ierobežojumu un neefektivitātes atklāšanu. Šajā rakstā ir aplūkoti veidi, kā izmantot profilēšanas rīkus Python programmu uzlabošanai. Apgūstot izpildes laiku, atmiņas patēriņa un frekvenču funkciju izsaukuma mērīšanu, mēs varam precīzi uzlabot.

Python koda optimizēšana, izmantojot profilēšanas rīkus

Iestatot Google Colab Python koda optimizēšanai ar profilēšanas rīkiem, mēs sākam ar Google Colab vides iestatīšanu. Ja esam iesācēji Colab, tā ir būtiska, jaudīga mākoņa platforma, kas nodrošina piekļuvi Jupyter piezīmjdatoriem un dažādām Python bibliotēkām. Mēs piekļūstam Colab, apmeklējot vietni (https://colab.research.google.com/) un izveidojot jaunu Python piezīmju grāmatiņu.

Importējiet profilēšanas bibliotēkas

Mūsu optimizācija balstās uz prasmīgu profilēšanas bibliotēku izmantošanu. Šajā kontekstā divas svarīgas bibliotēkas ir cProfile un line_profiler.







imports cProfils

imports line_profiler

Bibliotēka “cProfile” ir iebūvēts Python rīks koda profilēšanai, savukārt “line_profiler” ir ārēja pakotne, kas ļauj iedziļināties vēl dziļāk, analizējot kodu rindiņu pa rindiņai.



Šajā darbībā mēs izveidojam Python skripta paraugu, lai aprēķinātu Fibonači secību, izmantojot rekursīvo funkciju. Analizēsim šo procesu dziļāk. Fibonači secība ir skaitļu kopa, kurā katrs nākamais skaitlis ir divu pirms tā esošo skaitļu summa. Parasti tas sākas ar 0 un 1, tāpēc secība izskatās kā 0, 1, 1, 2, 3, 5, 8, 13, 21 utt. Tā ir matemātiska secība, ko tās rekursīvā rakstura dēļ parasti izmanto kā piemēru programmēšanā.



Mēs definējam Python funkciju, ko sauc par “Fibonači”, rekursīvajā Fibonači funkcijā. Šīs funkcijas arguments ir vesels skaitlis “n”, kas apzīmē vietu Fibonači secībā, kuru vēlamies aprēķināt. Mēs vēlamies atrast piekto skaitli Fibonači secībā, piemēram, ja “n” ir vienāds ar 5.





def fibonači ( n ) :

Tālāk mēs izveidojam pamata gadījumu. Rekursijas bāzes gadījums ir scenārijs, kas pārtrauc zvanus un atgriež iepriekš noteiktu vērtību. Fibonači secībā, kad “n” ir 0 vai 1, mēs jau zinām rezultātu. 0. un 1. Fibonači cipars ir attiecīgi 0 un 1.

ja n <= 1 :

atgriezties n

Šis “if” priekšraksts nosaka, vai “n” ir mazāks vai vienāds ar 1. Ja tā ir, mēs atgriežam pašu “n”, jo nav nepieciešama turpmāka rekursija.



Rekursīvs aprēķins

Ja “n” pārsniedz 1, mēs turpinām ar rekursīvo aprēķinu. Šajā gadījumā mums ir jāatrod “n”-tais Fibonači skaitlis, summējot “(n-1)” un “(n-2)” Fibonači skaitli. Mēs to panākam, funkcijā veicot divus rekursīvus izsaukumus.

cits :

atgriezties fibonači ( n - 1 ) + fibonači ( n - 2 )

Šeit “fibonači(n – 1)” aprēķina “(n-1)” Fibonači skaitli, un “fibonači(n – 2)” aprēķina “(n-2)” Fibonači skaitli. Mēs pievienojam šīs divas vērtības, lai iegūtu vēlamo Fibonači skaitli “n” pozīcijā.

Rezumējot, šī “fibonači” funkcija rekursīvi aprēķina Fibonači skaitļus, sadalot problēmu mazākās apakšproblēmās. Tas veic rekursīvus zvanus, līdz sasniedz bāzes gadījumus (0 vai 1), atgriežot zināmās vērtības. Jebkuram citam “n” tas aprēķina Fibonači skaitli, summējot divu rekursīvu izsaukumu rezultātus “(n-1)” un “(n-2)”.

Lai gan šī ieviešana ir vienkārša Fibonači skaitļu aprēķināšanai, tā nav visefektīvākā. Turpmākajās darbībās mēs izmantosim profilēšanas rīkus, lai noteiktu un optimizētu tā veiktspējas ierobežojumus labākam izpildes laikam.

Koda profilēšana, izmantojot CProfile

Tagad mēs profilējam savu “fibonači” funkciju, izmantojot “cProfile”. Šis profilēšanas uzdevums sniedz ieskatu katra funkcijas izsaukuma patērētajā laikā.

cprofiler = cProfils. Profils ( )

cprofiler. iespējot ( )

rezultāts = fibonači ( 30 )

cprofiler. atspējot ( )

cprofiler. print_stats ( kārtot = 'kumulatīvs' )

Šajā segmentā mēs inicializējam objektu “cProfile”, aktivizējam profilēšanu, pieprasām “fibonacci” funkciju ar “n=30”, deaktivizējam profilēšanu un parādām statistiku, kas sakārtota pēc kumulatīvā laika. Šī sākotnējā profilēšana sniedz mums augsta līmeņa pārskatu par to, kuras funkcijas patērē visvairāk laika.

! pip install line_profiler

imports cProfils

imports line_profiler

def fibonači ( n ) :

ja n <= 1 :

atgriezties n

cits :

atgriezties fibonači ( n - 1 ) + fibonači ( n - 2 )

cprofiler = cProfils. Profils ( )

cprofiler. iespējot ( )

rezultāts = fibonači ( 30 )

cprofiler. atspējot ( )

cprofiler. print_stats ( kārtot = 'kumulatīvs' )

Lai profilētu kodu rindiņu pa rindiņai ar line_profiler, lai iegūtu detalizētāku analīzi, mēs izmantojam “line_profiler”, lai segmentētu savu kodu pēc rindiņas. Pirms “line_profiler” izmantošanas pakotne ir jāinstalē Colab repozitorijā.

! pip install line_profiler

Tagad, kad ir gatavs line_profiler, mēs varam to lietot savai funkcijai Fibonacci:

%load_ext line_profiler

def fibonači ( n ) :

ja n <= 1 :

atgriezties n

cits :

atgriezties fibonači ( n - 1 ) + fibonači ( n - 2 )

%lprun -f fibonači fibonači ( 30 )

Šis fragments sākas ar paplašinājuma “line_profiler” ielādi, definē mūsu “fibonacci” funkciju un visbeidzot izmanto “%lprun”, lai profilētu funkciju “fibonacci” ar “n=30”. Tas piedāvā izpildes laiku segmentāciju pēc rindas, precīzi noskaidrojot, kur mūsu kods tērē savus resursus.

Pēc profilēšanas rīku palaišanas, lai analizētu rezultātus, tiks parādīts statistikas masīvs, kas parāda mūsu koda veiktspējas raksturlielumus. Šī statistika ietver kopējo katrai funkcijai patērēto laiku un katras koda rindas ilgumu. Piemēram, mēs varam atšķirt, ka Fibonači funkcija iegulda nedaudz vairāk laika, vairākas reizes pārrēķinot identiskas vērtības. Šis ir liekais aprēķins, un tā ir skaidra joma, kurā var izmantot optimizāciju, izmantojot memoizāciju vai iteratīvos algoritmus.

Tagad mēs veicam optimizācijas, kurās identificējām potenciālu mūsu Fibonači funkcijas optimizāciju. Mēs pamanījām, ka funkcija vairākas reizes pārrēķina vienus un tos pašus Fibonači skaitļus, kā rezultātā rodas nevajadzīga dublēšana un lēnāks izpildes laiks.

Lai to optimizētu, mēs ieviešam memoizāciju. Memoizācija ir optimizācijas paņēmiens, kas ietver iepriekš aprēķināto rezultātu (šajā gadījumā Fibonači skaitļu) saglabāšanu un atkārtotu izmantošanu, kad nepieciešams, nevis pārrēķināšanu. Tas samazina liekos aprēķinus un uzlabo veiktspēju, īpaši rekursīvām funkcijām, piemēram, Fibonači secībai.

Lai ieviestu iegaumēšanu mūsu Fibonači funkcijā, mēs rakstām šādu kodu:

# Vārdnīca aprēķināto Fibonači skaitļu glabāšanai
fib_cache = { }
def fibonači ( n ) :
ja n <= 1 :
atgriezties n
# Pārbaudiet, vai rezultāts jau ir saglabāts kešatmiņā
ja n iekšā fib_cache:
atgriezties fib_cache [ n ]
cits :
# Aprēķiniet un saglabājiet rezultātu kešatmiņā
fib_cache [ n ] = fibonači ( n - 1 ) + fibonači ( n - 2 )
atgriezties fib_cache [ n ] ,

Šajā pārveidotajā “fibonači” funkcijas versijā mēs ieviešam “fib_cache” vārdnīcu, lai saglabātu iepriekš aprēķinātos Fibonači skaitļus. Pirms Fibonači skaitļa aprēķināšanas mēs pārbaudām, vai tas jau ir kešatmiņā. Ja tā ir, mēs atgriežam kešatmiņā saglabāto rezultātu. Jebkurā citā gadījumā mēs to aprēķinām, saglabājam kešatmiņā un pēc tam atgriežam.

Profilēšanas un optimizācijas atkārtošana

Pēc optimizācijas (mūsu gadījumā atmiņa) ieviešanas ir ļoti svarīgi atkārtot profilēšanas procesu, lai uzzinātu mūsu izmaiņu ietekmi un nodrošinātu, ka esam uzlabojuši koda veiktspēju.

Profilēšana pēc optimizācijas

Mēs varam izmantot tos pašus profilēšanas rīkus “cProfile” un “line_profiler”, lai profilētu optimizēto Fibonači funkciju. Salīdzinot jaunos profilēšanas rezultātus ar iepriekšējiem, mēs varam izmērīt mūsu optimizācijas efektivitāti.

Lūk, kā mēs varam profilēt optimizēto “fibonacci” funkciju, izmantojot “cProfile”.

cprofiler = cProfils. Profils ( )

cprofiler. iespējot ( )

rezultāts = fibonači ( 30 )

cprofiler. atspējot ( )

cprofiler. print_stats ( kārtot = 'kumulatīvs' )

Izmantojot “line_profiler”, mēs to profilējam rindiņu pa rindiņai:

%lprun -f fibonači fibonači ( 30 )

Kods:

# Vārdnīca aprēķināto Fibonači skaitļu glabāšanai
fib_cache = { }

def fibonači ( n ) :
ja n <= 1 :
atgriezties n
# Pārbaudiet, vai rezultāts jau ir saglabāts kešatmiņā
ja n iekšā fib_cache:
atgriezties fib_cache [ n ]
cits :
# Aprēķiniet un saglabājiet rezultātu kešatmiņā
fib_cache [ n ] = fibonači ( n - 1 ) + fibonači ( n - 2 )
atgriezties fib_cache [ n ]
cprofiler = cProfils. Profils ( )
cprofiler. iespējot ( )

rezultāts = fibonači ( 30 )

cprofiler. atspējot ( )
cprofiler. print_stats ( kārtot = 'kumulatīvs' )
%lprun -f fibonači fibonači ( 30 )

Lai analizētu profilēšanas rezultātus pēc optimizācijas, tiks ievērojami samazināts izpildes laiks, īpaši lielām “n” vērtībām. Iegaumēšanas dēļ mēs novērojam, ka funkcija tagad pavada daudz mazāk laika, pārrēķinot Fibonači skaitļus.

Šīs darbības ir būtiskas optimizācijas procesā. Optimizācija ietver apzinātu izmaiņu veikšanu mūsu kodā, pamatojoties uz novērojumiem, kas iegūti no profilēšanas, savukārt atkārtota profilēšana nodrošina, ka mūsu optimizācija nodrošina gaidītos veiktspējas uzlabojumus. Veicot iteratīvu profilēšanu, optimizāciju un validāciju, mēs varam precizēt savu Python kodu, lai nodrošinātu labāku veiktspēju un uzlabotu mūsu lietojumprogrammu lietošanas pieredzi.

Secinājums

Šajā rakstā mēs apspriedām piemēru, kurā mēs optimizējām Python kodu, izmantojot profilēšanas rīkus Google Colab vidē. Mēs inicializējām piemēru ar iestatīšanu, importējām svarīgākās profilēšanas bibliotēkas, uzrakstījām paraugu kodus, profilējām to, izmantojot gan “cProfile”, gan “line_profiler”, aprēķinājām rezultātus, piemērojām optimizācijas un iteratīvi uzlabojām koda veiktspēju.