Podle Stackoverflow průzkumu 2019, Python programovací jazyk, sbíral 73.1% schválení mezi vývojáři. Řadí se na druhé místo za Rust a nadále dominuje v datové vědě a strojovém učení (ML).
Python je oblíbený pro vývojáře. Je to jazyk na vysoké úrovni známý svou robustností a základní filozofií―jednoduchostí nad složitostí. Výkon aplikace Python je však jiný příběh. Stejně jako každá jiná aplikace má svůj podíl na problémech s výkonem.
většinu času mohou nástroje APM, jako je Retrace, pomoci vyřešit problémy s výkonem aplikace. Ale co když vaše aplikace Python běží čtyři hodiny a server nemá paměť? To je specifický problém týkající se paměťových prostředků.
nazývá se únik paměti. Vývojáři musí najít viníka. To je, když Python paměti profilery přijde.
pojďme prozkoumat dále.
co jsou to profilery paměti Pythonu?
profilovací aplikace vždy zahrnují problémy, jako je CPU, paměť atd. Aplikace Python jsou však náchylné k problémům se správou paměti. Je to především proto, že Python je aplikován na Data Science a ML aplikace a pracuje s obrovským množstvím dat. Python se také ve výchozím nastavení spoléhá na svůj systém správy paměti, místo aby jej ponechal uživateli.
protože kód Pythonu pracuje v kontejnerech prostřednictvím distribuovaného rámce pro zpracování, každý kontejner obsahuje pevné množství paměti. Pokud spuštění kódu překročí limit paměti, kontejner se ukončí. To je, když vývoj zažívá chyby paměti.
není tomu tak však vždy. Existují případy, kdy vývojáři nevědí, co se děje. Možná, že objekt visí na odkazu, když to nemá být a hromadí se v průběhu času. Jakmile dosáhne svého vrcholu, dojde k problémům s pamětí.
rychlé řešení je zvýšit alokaci paměti. Není to však praktické, protože to může vést k plýtvání zdroji. Také to může ohrozit stabilitu aplikace kvůli nepředvídatelným špičkám paměti.
proto potřebujeme pomoc Pythonových paměťových profilerů. Účelem Python memory profilers je najít úniky paměti a optimalizovat využití paměti ve vašich aplikacích Python. Tyto typy Pythonových paměťových profilerů chápou prostorovou efektivitu použitého kódu a balíčků.
Top Python Memory Profilers
přestože Python automaticky spravuje paměť, potřebuje nástroje, protože dlouhotrvající Python úlohy spotřebovávají hodně paměti. Ve většině případů tyto úlohy nevrátí paměť do operačního systému, dokud proces neskončí, i když správně provede sběr odpadků.
zde je seznam známých profilerů paměti Pythonu:
Pympler
Jean Brouwers, Ludwig Haehne, a Robert Schuppenies postaven Pympler v srpnu 2008. Představili proces pymplingu, kde Pympler získává podrobnosti o velikosti a životnosti objektů Pythonu.
pympler je Python memory profiler analyzuje chování paměti objektu Python uvnitř spuštěné aplikace. Poskytuje kompletní a stand-alone Python paměti profilování řešení. Také promítá možnou chybu v runtime chování, jako je Udit paměť a další “ pymples.“
uvnitř Pympleru jsou tři samostatné moduly.
- modul asizeof poskytuje informace o velikosti objektu Pythonu.
- modul muppy zajišťuje on-line monitorování Python aplikace.
- modul Class Tracker poskytuje off-line analýzu životnosti vybraných objektů Pythonu.
nejprve použijme asizeof k prozkoumání toho, kolik paměti určité objekty Pythonu spotřebovávají.
>>> from pympler import asizeof
>>> obj =
>>> asizeof.asizeof(obj)
>>> print (asizeof.asized(obj, detail=1).format())
size=192 byt=48
(6, 4) velikost=64 ploché=32
“ já “ velikost=32 byt=32
3 velikost=16 plochý=16
2 size=16 plochý=16
1 velikost=16 plochý=16
za Druhé, pojďme implementovat muppy modulu:
>>> od pympler import muppy
>>> allObjects = muppy.get_objects()
>>> len(allObjects)
>>> od pympler import shrnutí
>>> = shrnutí.shrnout(allObjects)
>>> shrnutí.print_(sum)
types | | # objects | | total size |
========================== | | =========== | | ============ |
str | | 13262 | | 1.01 MB |
dict | | 2120 | | 659.99 KB |
code | | 3362 | | 343.73 KB |
list | | 2587 | | 247.46 KB |
type | | 639 | | 242.61 KB |
tuple | | 2069 | | 58.83 KB |
set | | 86 | | 44.57 KB |
wrapper_descriptor | | 1247 | | 43.84 KB |
builtin_function_or_method | | 1014 | | 35.65 KB |
method_descriptor | | 937 | | 32.94 KB |
abc.ABCMeta | | 66 | | 32.38 KB |
weakref | | 818 | | 28.76 KB |
int | | 1612 | | 24.72 KB |
getset_descriptor | | 555 | | 17.34 KB |
frozenset | | 90 | | 16.87 KB |
Zde si můžete prohlédnout všechny Python objekty do haldy pomocí muppy modul. Můžete zavolat další shrnutí a porovnat jej a zkontrolovat, zda některá pole mají úniky paměti. Další informace o modulu muppy naleznete zde.
třetím modulem v profileru Pympler je sledovač tříd. Sleduje životnost objektů určitých tříd. Thus, it provides insight into instantiation patterns and helps developers understand how specific objects contribute to the memory footprint in the long run.
>>> tr = classtracker.ClassTracker()
>>> tr.track_class(Document)
>>> tr.create_snapshot(description=’Snapshot 1′)
>>> doc = create_document()
>>> tr.create_snapshot(description=’Snapshot 2′)
>>> tr.stats.print_summary()
— PŘEHLED ———————-
Snímek 1 aktivní 0 B průměrná pct
Snímek 2 aktivní 0 B průměrná pct
—————————
dozvědět Se více o Třídě Tracker, klikněte zde.
Guppy3
Guppy3 (také známý jako Heapy) je programovací prostředí Python a sada nástrojů pro analýzu haldy. Jedná se o balíček, který obsahuje následující dílčí balíčky:
- etc-Jedná se o podpůrný modul, který má modul Glue protocol.
- gsl-dílčí balení, které obsahuje implementaci jazyka Guppy Specification. Vytváří dokumenty a testy ze společného zdroje.
- heapy – sada nástrojů pro analýzu haldy poskytuje objektové informace o haldě a zobrazuje informace.
- sady-obsahuje Bitsety a nodesety.
Guppy3 je vidlice Guppy-PE a byla postavena Sverkerem Nilssonem pro Python 2.
Poznámka: použití tohoto Python paměti profiler vyžaduje Python 3.5, 3.6, 3.7, nebo 3.8. Tento balíček funguje pouze pro CPython. Proto, PyPy a další implementace Překladače Pythonu nejsou podporovány. Také pro použití grafického prohlížeče potřebuje Tkinter. Při použití vzdáleného monitoru musí být navíc k dispozici závitování.
zde je návod, jak využít tohoto Python paměti profiler. Můžete pořídit snímek haldy před a po kritickém procesu. Poté porovnejte celkovou paměť a určete možné hroty paměti zapojené do běžných objektů.
>>> from guppy import hpy
>>> h=hpy()
>>> h.heap()
Partition of a set of 34090 objects. Total size = 2366226 bytes.
Index | Count | % | Size | % | Cumulative | % | Kind (class / dict of class) |
0 | 10279 | 30 | 666873 | 28 | 666873 | 28 | str |
1 | 4697 | 14 | 259576 | 11 | 926449 | 39 | bytes |
2 | 2413 | 7 | 251684 | 11 | 1178133 | 50 | types.CodeType |
3 | 6825 | 20 | 238084 | 10 | 1416217 | 60 | tuple |
4 | 448 | 1 | 174868 | 7 | 1591085 | 67 | type |
5 | 2208 | 6 | 150144 | 6 | 1741229 | 74 | function |
6 | 448 | 1 | 130964 | 6 | 1872193 | 79 | dict of type |
7 | 94 | 0 | 83532 | 4 | 1955725 | 83 | dict of module |
8 | 242 | 1 | 56524 | 2 | 2012249 | 85 | dict (no owner) |
9 | 1133 | 3 | 40788 | 2 | 2053037 | 87 | types.WrapperDescriptorType |
<118 more rows. Type e.g. ‘_.more’ to view.>
Memory Profiler
Memory Profiler is a pure Python module that uses the psutil module. Monitoruje spotřebu paměti procesu úlohy Pythonu. Také provádí analýzu spotřeby paměti aplikace po řádku.
režim využití paměti po řádku funguje stejným způsobem jako line_profiler.
- zdobí funkci, kterou chcete profilovat pomocí funkce @profile.
- skript můžete spustit pomocí speciálního skriptu. Použijte například konkrétní argumenty pro interpret Pythonu.
v následujícím příkladu máme jednoduchou funkci nazvanou my_func. Tato funkce vytvoří seznam se zadaným rozsahem.
@profile
def my_func():
a=
for i in range(1000):
a.append(i)
my_func()
This outputs:
Line # | Mem Usage | Increment | Line Contents |
1 | 13.859 MiB | 13.859 MiB | @profile |
2 | def my_func(): | ||
3 | 13.859 MiB | 0.000 MiB | a= |
4 | 13.859 MiB | 0.000 MiB | for i in range(1000): |
5 | 13.859 MiB | 0.000 MiB | .append () |
V prvním sloupci je číslo řádku z profilované kód. Mem usage je využití paměti interpretu Pythonu po každém spuštění kódu. Třetí sloupec (přírůstek) představuje rozdíl v paměti aktuálního řádku k poslednímu. Poslední sloupec (obsah řádku) zobrazuje profilované kódy.
To see how this Python memory profiler works, let’s change the range value to 1000000 in the function above and execute it. Here is the output:
Line # | Mem usage | Increment | Line Contents |
1 | 13.844 MiB | 13.844 MiB | @profile |
2 | def my_func(): | ||
3 | 13.844 MiB | 0.000 MiB | a= |
4 | 33.387 MiB | 0.016 MiB | for i in range(1000000): |
5 | 33.387 MiB | 0.293 MiB | .append () |
Řádek 4 a 5 ukazují zvýšení využití paměti, což dokazuje, že tento profiler provádí line-by-line analýzu spotřeby paměti.
Fil
Fil profiler je open-source Python memory profiler. Je vhodný pro zpracování dat a vědecké výpočetní aplikace. V současné době je stále ve fázi vývoje a běží pouze na Linuxu a macOS.
většina datových vědců a vývojářů Pythonu čelí problémům s pamětí s datovým potrubím Pythonu. Když používá příliš mnoho paměti, je obtížné určit, kam přesně veškerá paměť jde.
uveďme například dva scénáře:
servery
protože servery běží nepřetržitě, úniky paměti jsou často příčinou selhání výkonu. Vývojáři zanedbávají malé množství úniku paměti, protože většina serverů zpracovává malé množství dat najednou. Ty však mohou přidat až desítky tisíc hovorů. V důsledku toho by to mohlo v průběhu času způsobit vážné problémy s výrobou.
datové potrubí
při zpracování velkých kusů dat přinášejí špičky využití paměti obrovské hrozby pro datové potrubí. Například, pokud vaše aplikace používá 1GB RAM po nějakou dobu a pak najednou potřebuje 16GB RAM. Existuje velká potřeba zjistit, co způsobuje náhlé hroty paměti.
to je hlavní cíl Fil-diagnostikovat špičky využití paměti, bez ohledu na množství zpracovávaných dat. Určuje, kde přesně je maximální využití paměti a jaký kód je zodpovědný za tento bodec.
ačkoli existují existující profily paměti Pythonu, které měří využití paměti, má omezení. Jeden z nich se zabývá obrovským množstvím dat―dávkovým zpracováním. Python aplikace jsou většinou dávkové zpracování aplikací, kde se neustále číst data, zpracovávat a výstup výsledek.
na tento problém odpovídá náš další profiler.
Blackfire
u vysoce dynamického jazyka, jako je Python, má většina vývojářů problémy s pamětí během nasazení. To vede k určitému zmatku, co se stane s využitím paměti. Vývojáři mají tendenci provádět optimalizace, ale nemají správné nástroje k použití.
Blackfire je proprietární Python memory profiler (možná první. Používá správce paměti Pythonu ke sledování každého bloku paměti přiděleného Pythonem, včetně rozšíření C. Blackfire je v oboru nový a jeho cílem je řešit problémy s úniky paměti, jako jsou:
- velké objekty v paměti, které nejsou uvolněny
- referenční cykly
- neplatná referenční počítání v C rozšíření, což způsobuje nevracení paměti
- náhlé paměti hroty
S těmito případy použití, Blackfire ujišťuje uživatele, že má velmi omezenou režii a nemá vliv na koncové uživatele, protože je to opatření, Python aplikace je spotřeba paměti při volání funkce úroveň.
Blackfire Python memory profiler používá PYMEM_SETALLOCATOR API pro sledování alokací paměti, jako je tracemalloc. V současné době Blackfire podporuje Python verze 3.5 a vyšší. Můžete navštívit jeho stránky se dozvědět více.
profilování pomocí Retrace
Pokud pracujete s Pythonem, zjistíte, že okamžitě neuvolňuje paměť zpět do operačního systému. Proto jej spustíte v samostatném procesu, abyste zajistili uvolnění paměti po provedení kódu. To se provádí pomocí užitečného přístupu zvaného “ malý testovací případ.“Tento proces umožňuje spustit pouze příslušný kód úniku paměti.
při práci s velkým množstvím dat použijte podmnožinu náhodně odebraných dat. Také spusťte úlohy náročné na paměť v samostatných procesech a pomocí debuggerů přidejte odkazy na objekty. Zvažte však, že použití debuggeru breakpoint, jako je pdb, umožňuje, aby všechny objekty vytvořené a odkazované ručně z debuggeru zůstaly v profilu paměti. To bude mít za následek falešný pocit úniku paměti, protože objekty nejsou uvolněny včas. Navíc zvažte pohled do balíčků, které mohou být netěsné. Existují knihovny Pythonu, které by mohly mít únik paměti.
nyní již víte, jak fungují profily paměti Pythonu a běžné problémy s pamětí s Pythonem. Nástroje jako Retrace s centralizovaným protokolováním, sledováním chyb a profilováním kódu vám však mohou pomoci diagnostikovat problémy Pythonu ve větším měřítku. Retrace od Stackify vám pomůže vypořádat se s jakýmikoli úskalími výkonu a udržet váš kód v chodu dobře.
začněte 14denní bezplatnou zkušební verzi Retrace ještě dnes!