Како да оптимизујете свој Питхон код помоћу алата за профилисање

Kako Da Optimizujete Svoj Pithon Kod Pomocu Alata Za Profilisane



Побољшање перформанси Питхон кода је драгоцена вештина за програмере. Алати за профилисање су неопходни у овом случају и олакшавају откривање ограничења кода и неефикасности. Овај чланак испитује начине коришћења алата за профилисање за побољшање Питхон програма. Савладавањем мерења времена извршавања, потрошње меморије и фреквенција позива функције, можемо прецизно побољшати.

Оптимизација Питхон кода помоћу алата за профилисање

Подешавање Гоогле Цолаб-а да ради на оптимизацији Питхон кода помоћу алата за профилисање, почињемо подешавањем Гоогле Цолаб окружења. Ако смо нови у Цолаб-у, то је суштинска, моћна платформа заснована на облаку која омогућава приступ Јупитер бележницама и низу Питхон библиотека. Приступамо Цолаб-у тако што посетимо (30ДБД397ЦБА9Ц5ФФ093ДА738ДЦ571Ц39ЕДФ3262Ц) и креирамо нову Питхон бележницу.

Увезите библиотеке профилисања

Наша оптимизација се ослања на вешто коришћење библиотека за профилисање. Две важне библиотеке у овом контексту су цПрофиле и лине_профилер.







увоз цПрофил

увоз лине_профилер

Библиотека „цПрофиле“ је уграђени Питхон алат за профилисање кода, док је „лине_профилер“ спољни пакет који нам омогућава да идемо још дубље, анализирајући код ред по ред.



У овом кораку креирамо узорак Питхон скрипте за израчунавање Фибоначијевог низа помоћу рекурзивне функције. Хајде да детаљније анализирамо овај процес. Фибоначијев низ је скуп бројева у коме је сваки узастопни број збир два броја пре њега. Обично почиње са 0 и 1, тако да секвенца изгледа као 0, 1, 1, 2, 3, 5, 8, 13, 21 итд. То је математички низ који се обично користи као пример у програмирању због своје рекурзивне природе.



Дефинишемо Питхон функцију под називом „Фибоначи“ у рекурзивној Фибоначијевој функцији. Ова функција узима 'н' цео број као свој аргумент, који представља позицију у Фибоначијевом низу који желимо да израчунамо. Желимо да лоцирамо пети број у Фибоначијевом низу, на пример, ако је „н“ једнако 5.





деф фибоначи ( н ) :

Затим успостављамо основни случај. Основни случај у рекурзији је сценарио који прекида позиве и враћа унапред одређену вредност. У Фибоначијевом низу, када је „н“ 0 или 1, већ знамо резултат. 0. и 1. Фибоначијеви бројеви су 0 и 1, респективно.

ако н <= 1 :

повратак н

Ова „иф“ изјава одређује да ли је „н“ мање или једнако 1. Ако јесте, враћамо сам „н“, пошто нема потребе за даљом рекурзијом.



Рекурзивно израчунавање

Ако „н” прелази 1, настављамо са рекурзивним прорачуном. У овом случају, потребно је да пронађемо „н“-ти Фибоначијев број тако што ћемо сабирати „(н-1)“-ти и „(н-2)“-ти Фибоначијев број. Ово постижемо тако што направимо два рекурзивна позива унутар функције.

друго :

повратак фибоначи ( н - 1 ) + фибоначи ( н - 2 )

Овде „фибоначи (н – 1)” израчунава „(н-1)”-ти Фибоначијев број, а „фибоначи (н – 2)” израчунава „(н-2)”-ти Фибоначијев број. Додајемо ове две вредности да добијемо жељени Фибоначијев број на позицији „н“.

Укратко, ова „фибоначијева“ функција рекурзивно израчунава Фибоначијеве бројеве разбијајући проблем на мање под-проблеме. Врши рекурзивне позиве док не достигне основне случајеве (0 или 1), враћајући познате вредности. За било које друго „н”, он израчунава Фибоначијев број сумирањем резултата два рекурзивна позива за „(н-1)” и „(н-2)”.

Иако је ова имплементација једноставна за израчунавање Фибоначијевих бројева, није најефикаснија. У каснијим корацима користићемо алате за профилисање да идентификујемо и оптимизујемо ограничења перформанси за боље време извршења.

Профилисање кода помоћу ЦПрофила

Сада профилишемо нашу „фибоначи“ функцију користећи „цПрофиле“. Ова вежба профилисања пружа увид у време које је потрошио сваки позив функције.

цпрофилер = цПрофил. Профил ( )

цпрофилер. омогућити ( )

резултат = фибоначи ( 30 )

цпрофилер. онемогућити ( )

цпрофилер. принт_статс ( врста = 'кумулативно' )

У овом сегменту иницијализујемо објекат „цПрофиле“, активирамо профилисање, захтевамо „фибоначи“ функцију са „н=30“, деактивирамо профилисање и приказујемо статистику која је сортирана по кумулативном времену. Ово почетно профилисање нам даје преглед на високом нивоу о томе које функције троше највише времена.

! пип инсталл лине_профилер

увоз цПрофил

увоз лине_профилер

деф фибоначи ( н ) :

ако н <= 1 :

повратак н

друго :

повратак фибоначи ( н - 1 ) + фибоначи ( н - 2 )

цпрофилер = цПрофил. Профил ( )

цпрофилер. омогућити ( )

резултат = фибоначи ( 30 )

цпрофилер. онемогућити ( )

цпрофилер. принт_статс ( врста = 'кумулативно' )

За профилисање кода ред по ред помоћу лине_профилер-а ради детаљније анализе, користимо „лине_профилер“ да сегментирамо наш код ред по ред. Пре употребе „лине_профилер“, морамо да инсталирамо пакет у Цолаб спремиште.

! пип инсталл лине_профилер

Сада када имамо спреман „лине_профилер“, можемо га применити на нашу „фибоначи“ функцију:

%лоад_ект лине_профилер

деф фибоначи ( н ) :

ако н <= 1 :

повратак н

друго :

повратак фибоначи ( н - 1 ) + фибоначи ( н - 2 )

%лпрун -ф фибоначи фибоначи ( 30 )

Овај исечак почиње учитавањем екстензије „лине_профилер“, дефинише нашу „фибоначи“ функцију и на крају користи „%лпрун“ да профилише функцију „фибоначи“ са „н=30“. Нуди ред по ред сегментацију времена извршавања, прецизно разјашњавајући где наш код троши своје ресурсе.

Након покретања алата за профилисање за анализу резултата, биће представљен низ статистичких података који показују карактеристике перформанси нашег кода. Ове статистике укључују укупно време потрошено унутар сваке функције и трајање сваке линије кода. На пример, можемо разликовати да Фибоначијева функција улаже мало више времена у прерачунавање идентичних вредности више пута. Ово је редундантно израчунавање и то је јасна област у којој се може применити оптимизација, било мемоизацијом или коришћењем итеративних алгоритама.

Сада правимо оптимизације где смо идентификовали потенцијалну оптимизацију у нашој Фибоначијеви функцији. Приметили смо да функција поново израчунава исте Фибоначијеве бројеве више пута, што доводи до непотребног залиха и споријег времена извршавања.

Да бисмо ово оптимизовали, имплементирамо мемоизацију. Мемоизација је техника оптимизације која укључује чување претходно израчунатих резултата (у овом случају Фибоначијевих бројева) и њихово поновно коришћење када је потребно уместо поновног израчунавања. Ово смањује редундантне прорачуне и побољшава перформансе, посебно за рекурзивне функције као што је Фибоначијев низ.

Да бисмо имплементирали мемоизацију у нашу Фибоначијеву функцију, пишемо следећи код:

# Речник за чување израчунатих Фибоначијевих бројева
фиб_цацхе = { }
деф фибоначи ( н ) :
ако н <= 1 :
повратак н
# Проверите да ли је резултат већ кеширан
ако н ин фиб_цацхе:
повратак фиб_цацхе [ н ]
друго :
# Израчунајте и кеширајте резултат
фиб_цацхе [ н ] = фибоначи ( н - 1 ) + фибоначи ( н - 2 )
повратак фиб_цацхе [ н ] ,

У овој модификованој верзији „фибоначијеве“ функције уводимо речник „фиб_цацхе“ за чување претходно израчунатих Фибоначијевих бројева. Пре него што израчунамо Фибоначијев број, проверавамо да ли је већ у кешу. Ако јесте, враћамо кеширани резултат. У сваком другом случају, ми га израчунамо, чувамо у кешу, а затим га враћамо.

Понављање профилисања и оптимизације

Након имплементације оптимизације (мемоизација у нашем случају), кључно је поновити процес профилисања да бисмо знали утицај наших промена и осигурали да смо побољшали перформансе кода.

Профилисање након оптимизације

Можемо користити исте алате за профилисање, „цПрофиле“ и „лине_профилер“, да профилишемо оптимизовану Фибоначијеву функцију. Упоређивањем нових резултата профилисања са претходним, можемо измерити ефикасност наше оптимизације.

Ево како можемо да профилишемо оптимизовану функцију „фибоначи“ користећи „цПрофиле“:

цпрофилер = цПрофил. Профил ( )

цпрофилер. омогућити ( )

резултат = фибоначи ( 30 )

цпрофилер. онемогућити ( )

цпрофилер. принт_статс ( врста = 'кумулативно' )

Користећи „лине_профилер“, профилишемо га ред по ред:

%лпрун -ф фибоначи фибоначи ( 30 )

код:

# Речник за чување израчунатих Фибоначијевих бројева
фиб_цацхе = { }

деф фибоначи ( н ) :
ако н <= 1 :
повратак н
# Проверите да ли је резултат већ кеширан
ако н ин фиб_цацхе:
повратак фиб_цацхе [ н ]
друго :
# Израчунајте и кеширајте резултат
фиб_цацхе [ н ] = фибоначи ( н - 1 ) + фибоначи ( н - 2 )
повратак фиб_цацхе [ н ]
цпрофилер = цПрофил. Профил ( )
цпрофилер. омогућити ( )

резултат = фибоначи ( 30 )

цпрофилер. онемогућити ( )
цпрофилер. принт_статс ( врста = 'кумулативно' )
%лпрун -ф фибоначи фибоначи ( 30 )

Да би се анализирали резултати профилисања након оптимизације, биће значајно смањено време извршења, посебно за велике вредности „н“. Због меморисања, примећујемо да функција сада троши много мање времена на поновно израчунавање Фибоначијевих бројева.

Ови кораци су неопходни у процесу оптимизације. Оптимизација подразумева прављење информисаних промена у нашем коду на основу запажања добијених профилисањем, док понављање профилисања обезбеђује да наше оптимизације доносе очекивана побољшања перформанси. Итеративним профилисањем, оптимизацијом и валидацијом, можемо фино да подесимо наш Питхон код како бисмо пружили боље перформансе и побољшали корисничко искуство наших апликација.

Закључак

У овом чланку смо расправљали о примеру где смо оптимизовали Питхон код помоћу алата за профилисање у оквиру Гоогле Цолаб окружења. Иницијализовали смо пример са подешавањем, увезли основне библиотеке за профилисање, написали узорке кодова, профилисали га користећи и „цПрофиле“ и „лине_профилер“, израчунали резултате, применили оптимизације и итеративно побољшали перформансе кода.