logo

sizeof w Pythonie

Kiedy piszemy duże skrypty lub kod składający się z wielu linii, zarządzanie pamięcią powinno być naszym najwyższym priorytetem. Dlatego oprócz dobrej wiedzy programistycznej powinniśmy posiadać dobrą wiedzę na temat wydajnej obsługi pamięci. W Pythonie mamy wiele funkcji pozwalających określić rozmiar pamięci konkretnego obiektu występującego w programie, a jedną z takich funkcji jest __sizeof__(). W tym samouczku dowiemy się o funkcji __sizeof__() i jej działaniu w programie Python.

Funkcja __sizeof__() w Pythonie

Funkcja __sizeof__() w Pythonie nie mówi nam dokładnie rozmiaru obiektu. Nie zwraca rozmiaru obiektu generatora, ponieważ Python nie może nam wcześniej powiedzieć, jaki jest rozmiar generatora. Mimo to w rzeczywistości zwraca wewnętrzny rozmiar określonego obiektu (w bajtach) zajmującego pamięć.

Aby to zrozumieć, spójrzmy na następujący przykładowy program z nieskończonym obiektem generatora.

Przykład 1: Spójrz na następujący program w Pythonie:

 # 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__()) 

Wyjście

 Internal memory size of endless generator object: 120 

Wyjaśnienie:

Użyliśmy domyślnej funkcji, tj. nieograniczoneGenerator(), aby utworzyć w programie obiekt generatora nieskończonego. W funkcji zainicjowaliśmy zmienną, czyli liczenie = 0. Użyliśmy pętli while na zmiennej zliczającej, nie podając punktu przerwania w pętli. Tworząc nieskończoną pętlę w funkcji, uczyniliśmy domyślną funkcję nieskończonym obiektem generatora. Na koniec wydrukowaliśmy rozmiar pamięci wewnętrznej obiektu generatora nieskończonego za pomocą funkcji __sizeof__().

Teraz możemy jasno zrozumieć działanie funkcji __sizeof__(). Ponieważ nieskończony obiekt generatora w powyższym programie nie ma żadnego punktu końcowego ani punktu przerwania, Python nie może nam wcześniej określić rozmiaru generatora. Ale jednocześnie możemy sprawdzić rozmiar pamięci wewnętrznej przydzielonej obiektowi generatora za pomocą funkcji __sizeof__(), ponieważ musi on zajmować jakąś pamięć wewnętrzną w Pythonie.

Przyjrzyjmy się jeszcze jednemu przykładowi, w którym używamy funkcji __sizeof__() w celu uzyskania rozmiaru pamięci wewnętrznej bez żadnych narzutów.

Przykład 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__()) 

Wyjście

 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 

Wyjaśnienie:

Używając funkcji __sizeof__() możemy wyraźnie zobaczyć, że rozmiar pamięci wewnętrznej pustej listy wynosi 40 bajtów, a każdy element obecny na liście dodaje 8 bajtów do całkowitego rozmiaru pamięci listy.