Користите ове савете да анализирате свој код и откријете где је најефикаснији или најмање ефикасан.
Пошто „постоји више од једног начина да се то уради“ у Питхон-у, проналажење приступа најефикаснијег за меморију за неке задатке може бити изазов. Овде може помоћи меморијски профилер. Поред праћења цурења, процена меморијског профила вашег кода помаже да се утврди који код је меморијски ефикасан.
Без обзира да ли развијате модел машинског учења или веб локацију са Питхон-ом, можете да процените меморијски профил за скрипте, појединачне линије кода или функције.
Процена меморијског профила ваше целе базе кода може бити непрактична, јер то може значајно успорити вашу апликацију. Уместо тога, најбоље је да селективно профилишете функције или методе за које сумњате да могу да троше више меморије. Али чак и ако желите да ово урадите за целу апликацију, можда ћете желети да посветите изоловани модул за руковање.
У Питхон-у постоји много библиотека за профилисање. Неки од најпопуларнијих су мемори_профилер, псутил, Трацемаллоц, и пимплер. Овај водич користи мемори_профилер и псутил.
Док псутил идеалан је за процену укупне потрошње меморије извршења методе или функције, мемори_профилер даје детаљније информације о коришћењу меморије, укључујући ред-по-према и трендове коришћења на функционалном нивоу током времена.
За почетак, инсталирајте мемори_профилер у ваше Питхон виртуелно окружење. Ово се такође инсталира псутил.
пип инсталл мемори_профилер
Добијте величину објекта у меморији
Можете започети профилисање меморије тако што ћете прво израчунати величину објекта који намеравате да користите у меморији.
Овај тип профилисања је од помоћи на почетку развоја — док покушавате да одредите који тип објекта да се користи у програму.
На пример, ако заглавите у одлучивању које методе ћете користити за постизање задатка, рецимо, одговарајући Питхон тип података, можете добити величину сваког у бајтовима да бисте одредили који је лакши за вашу употребу случај.
Тхе сис.гетсизеоф уграђени метод је користан овде:
увоз сис
штампа (ф"величина листе: {сис.гетсизеоф([])} бајтова")
штампа (ф"величина речника: {сис.гетсизеоф (дицт)} бајтова")
штампа (ф"величина тупле: {сис.гетсизеоф(())} бајтова")
штампа (ф"сет величина: {сис.гетсизеоф({})} бајтова")
Ево излаза:
Такође можете користити сис.гетсизеоф метод за упоређивање величине меморије уграђене и прилагођене функције.
На пример, упоредите ову функцију прилагођене дужине која користи Питхон фор петљу са уграђеним лен функција:
увоз сис
дефгетЛенгтх(итерабле):
цоунт = 0за и ин итерабле:
цоунт +=1повратак цоунт
штампа (ф"Уграђена функција дужине: {сис.гетсизеоф (лен)} бајтова")
штампа (ф"Функција прилагођене дужине: {сис.гетсизеоф (гетЛенгтх)} бајтова")
Код изнад даје следећи излаз:
Међутим, док сис.гетсизеоф мери величину објекта у меморији, узима у обзир само сам објекат, а не оне који га упућују. За то ће вам требати детаљнији метод профилисања.
Пронађите меморијски профил Питхон функције
Можете добити детаљнији меморијски профил сваке линије кода функције користећи мемори_профилер пакет. Ово укључује додавање @профил декоратер за вашу функцију или метод:
увоз панде
импорт нумпи
из профила за увоз мемори_профилерманипулисати класом:
@профил
деф манипулатеДата (селф):
дф = панде. Оквир података({
'А' :[0, 3, нумпи.нан, 10, 3, нумпи.нан],
'Б': [нумпи.нан, "Пандас", нумпи.нан, "Пандас", "Питхон", "ЈаваСцрипт"],
})дф.филлна (метход='бфилл', инплаце=Труе)
дф.филлна (метход='ффилл', инплаце=Труе)
врати стр (дф)
манип = Манипулисати()
принт (манип.манипулатеДата())
Горњи код даје детаљан меморијски профил сваке линије кода у функцији као што је приказано:
Тхе Употреба меморије колона означава употребу меморије за одређену линију кода, док је Повећање колона приказује режијске трошкове које доприноси сваки ред. Тхе Појава колона дефинише колико пута линија кода додељује или ослобађа меморију.
На пример, у горњем излазу, ред 11 се појавио два пута са повећањем меморије од 0,1 МиБ (Мебибајт), повећавајући употребу меморије на 55,4 МиБ. Линије 19 и 22 су такође допринеле 0,2 МиБ и 0,3 МиБ, респективно, чиме је укупна употреба меморије износила 55,9 МиБ.
Пронађите меморијски профил Питхон скрипте према временској ознаци
Такође можете проценити меморијски профил целе Питхон скрипте користећи мемори_профилер покретањем мпф наредба у терминалу као што је приказано:
мпоф покрените име_скрипте.пи
Горња команда узоркује наведену скрипту сваких 0,1с и аутоматски креира а .дат датотеку у вашем тренутном директоријуму пројекта.
Цифре које следе МЕМ нотација су профили употребе меморије Питхон скрипте у одређеном временском интервалу. Последње бројке са десне стране представљају временску ознаку коју је профилер ухватио за сваку употребу меморије.
Такође можете добити графикон меморијског профила. Ово захтева инсталацију матплотлиб:
пип инсталл матплотлиб
Једном инсталиран, покрените мпф наредба овако:
мппроф плот
Ево излаза у овом случају:
Покрените профил меморије скрипте у наменској Питхон датотеци
Можда ћете желети да профилишете за различите Питхон скрипте. Можете да урадите ово користећи наменски Питхон модул преко Питхон-а подпроцес.
На овај начин можете одвојити свој меморијски профилер од базе кода и локално сачувати излаз графикона:
увоз подпроцес
субпроцесс.рун([
'мпроф', 'трцати', '--инцлуде-цхилдрен', 'миссинг.пи'
])
# сачувајте резултате графике локално
субпроцесс.рун(['мпроф', 'заплет', '--оутпут=оутпут.јпг'])
Да бисте покренули меморијски профил скрипте, потребно је само да покренете Питхон датотеку која садржи горњи код. Ово генерише графикон меморијског профила (оутпут.јпг) у директоријуму датотека:
Пронађите количину меморије која се користи од извршења функције
Можете пронаћи укупни меморијски профил методе или функције током извршавања користећи псутил пакет.
На пример, да профилишете претходни Пандас ДатаФраме манипулација метод унутар друге Питхон датотеке:
увоз псутил
увоз сис
увоз ос
сис.патх.аппенд (сис.патх[0] + "/..")# увозите класу која садржи ваш метод
из неки код.недостаје увоз Манипулисати# инстанцирајте класу
манип = Манипулисати()процес = псутил. Процес (ос.гетпид())
почетна_меморија = процесс.мемори_инфо().рсс# покрените циљни метод:
манип.манипулатеДата()
# добија информације о меморији након извршења
финал_мемори = процесс.мемори_инфо().рсс
меморија_потрошена = коначна_меморија - почетна_меморија
мемори_цонсумед_мб = меморија_цонсумед / (1024 * 1024)
штампа (ф"Меморија коју функција троши: {мемори_цонсумед_мб:.2ф} МБ")
Горе наведено процењује укупан меморијски профил методе у мегабајтима (МБ) као што је приказано:
Пронађите меморијски профил линије кода у Јупитер бележници
Ако користите иПитхон у Јупитер Нотебоок-у, можете израчунати меморијски профил једнолинера користећи мемори_профилер. Потребно је само да учитате мемори_профилер у једној ћелији. Затим додајте %мемит магичну функцију за ваш код у наредним ћелијама; ово враћа вршну меморију кода и увећану величину.
Овај метод не ради са редовним Питхон скриптама осим иПитхон-а у Јупитер бележници.
На пример:
Такође можете користити %мемит магична функција у Јипитер Нотебоок-у за профилисање меморије функције током рада:
Побољшајте ефикасност меморије у свом Питхон коду
Узимајући у обзир тешке задатке подизања података за које често користимо Питхон, свакој линији кода је потребна адекватна оптимизација за управљање употребом меморије. Док Питхон има много уграђених Питхон функција, нереференцирани објекти резултирају цурењем меморије.
Ако сте испуштали сваку Питхон синтаксу која ради у вашој бази кода без разматрања употребе меморије, можда бисте желели да се осврнете уназад пре него што одете предалеко.