Keď píšeme veľké skripty alebo kód s mnohými riadkami, správa pamäte by mala byť našou najvyššou prioritou. Preto by sme mali mať okrem dobrých znalostí programovania aj dobré znalosti efektívneho zaobchádzania s pamäťou. V Pythone máme veľa funkcií na získanie veľkosti konkrétneho objektu prítomného v programe v pamäti a jednou z takýchto funkcií je __sizeof__(). V tomto návode sa dozvieme o funkcii __sizeof__() a jej fungovaní v programe Python.
Funkcia Python __sizeof__().
Funkcia __sizeof__() v Pythone nám presne nepovie veľkosť objektu. Nevracia veľkosť objektu generátora, pretože Python nám nemôže vopred povedať, aká veľká je veľkosť generátora. V skutočnosti však vracia vnútornú veľkosť konkrétneho objektu (v bajtoch), ktorý zaberá pamäť.
Aby sme to pochopili, pozrime sa na nasledujúci príklad programu s objektom nekonečného generátora.
Príklad 1: Pozrite sa na nasledujúci program Python:
# A default function with endless generator object in it def endlessGenerator(): # A counting variable to initialize the generator counting = 0 # Using while loop to create an endless generator while True: yield counting counting += 1 # Creating infinite loop # Printing memory size of a generator object print('Internal memory size of endless generator object: ', endlessGenerator.__sizeof__())
Výkon
Internal memory size of endless generator object: 120
Vysvetlenie:
Na vytvorenie objektu nekonečného generátora v programe sme použili predvolenú funkciu, t. j. endlessGenerator(). Vo funkcii sme inicializovali premennú, t.j. počítanie = 0. Použili sme cyklus while na počítaciu premennú bez toho, aby sme dali prerušovací bod cyklu. Vytvorením nekonečnej slučky vo funkcii sme urobili predvolenú funkciu ako objekt nekonečného generátora. Nakoniec sme vytlačili veľkosť vnútornej pamäte objektu nekonečného generátora pomocou funkcie __sizeof__().
Teraz môžeme jasne pochopiť fungovanie funkcie __sizeof__(). Keďže objekt nekonečného generátora vo vyššie uvedenom programe nemá žiadny koniec ani bod prerušenia, Python nám nemôže vopred povedať veľkosť generátora. Zároveň však môžeme skontrolovať veľkosť vnútornej pamäte pridelenej objektu generátora funkciou __sizeof__(), pretože musí zaberať určitú vnútornú pamäť v Pythone.
Pozrime sa ešte na jeden príklad, kde použijeme funkciu __sizeof__() na získanie veľkosti vnútornej pamäte bez akejkoľvek réžie.
Príklad 2:
# Define an empty list in the program emptyList = [] # Printing size of empty list print('Internal memory size of an empty list: ', emptyList.__sizeof__()) # Define some lists with elements a = [24] b = [24, 26, 31, 6] c = [1, 2, 6, 5, 415, 9, 23, 29] d = [4, 5, 12, 3, 2, 9, 20, 40, 32, 64] # Printing internal memory size of lists print('Memory size of first list: ', a.__sizeof__()) print('Memory size of second list: ', b.__sizeof__()) print('Memory size of third list: ', c.__sizeof__()) print('Memory size of fourth list: ', d.__sizeof__())
Výkon
Internal memory size of an empty list: 40 Memory size of first list: 48 Memory size of second list: 104 Memory size of third list: 104 Memory size of fourth list: 136
Vysvetlenie:
Pomocou funkcie __sizeof__() môžeme jasne vidieť, že veľkosť vnútornej pamäte prázdneho zoznamu je 40 bajtov a každý prvok prítomný v zozname pridáva veľkosť 8 bajtov k celkovej veľkosti pamäte zoznamu.