Tablice w Pythonie wyjaśnione!

Jan 23 2023
Jeśli zaczynasz przygodę z programowaniem lub uczysz się o Pythonie, ten artykuł jest dla Ciebie, tablice są jedną z najczęściej używanych struktur danych. W jaki sposób Python reprezentuje tablice? Jak możemy manipulować tablicami w Pythonie, aby rozwiązać różne problemy? Tego właśnie dowiemy się w tym artykule.
Obraz ekranu kodowania

Jeśli zaczynasz przygodę z programowaniem lub uczysz się o Pythonie, ten artykuł jest dla Ciebie, tablice są jedną z najczęściej używanych struktur danych. W jaki sposób Python reprezentuje tablice? Jak możemy manipulować tablicami w Pythonie, aby rozwiązać różne problemy? Tego właśnie dowiemy się w tym artykule.

Jak komputery przechowują informacje?

Jak wiesz, najbardziej podstawowa forma informacji w komputerze składa się z bitów informacji. 8 bitów tych informacji jest następnie grupowanych w to, co nazywamy bajtem .

Ponieważ komputery mogą przechowywać bardzo duże fragmenty tych bajtów, potrzebują nowego mechanizmu, który umożliwi im szybkie odczytywanie i zapisywanie bajtów, w tym miejscu wchodzą w grę adresy pamięci , podobnie jak osobisty adres domowy odróżnia miejsce zamieszkania od sąsiada, komputer używa adresów pamięci do rozróżnienia, gdzie znajdują się różne fragmenty danych i informacji.

Warto również wspomnieć, że komputer potrzebuje czasu dostępu O(1), aby dotrzeć do dowolnego adresu pamięci, co oznacza, że ​​dostęp do bajtu #5489637 jest taki sam jak dostęp do bajtu #64.

Co to są tablice?

Powszechną praktyką w językach programowania jest używanie zmiennych w celu odniesienia się do adresu w pamięci, na przykład identyfikator X może odnosić się do bajtu nr 32.

W przypadku, gdy chcemy przechowywać wiele adresów pamięci, tworzenie wielu identyfikatorów nie jest wydajne i skalowalne. Wolelibyśmy więcej, gdybyśmy mieli jedną nazwę dla grupy identyfikatorów i używali numerów, aby uzyskać dostęp do określonych identyfikatorów. Taka reprezentacja to tablica, innymi słowy jest to reprezentacja grupy zmiennych w ciągłej części pamięci komputera.

Na przykład ciągi znaków w Pythonie są przechowywane w ten sposób, powiedzmy, że deklarujesz nową zmienną z tekstem „przykład”, który Python przydzieli:

2 bajty (pamięć potrzebna do zapisania znaku Unicode) * 7 (liczba znaków w przykładzie słowa) = 14 bajtów ciągłej pamięci do przechowywania tej zmiennej.

Tablice referencyjne

Python używa innego rodzaju tablic, które są tablicami referencyjnymi, aby je zrozumieć, spójrzmy na ten przykład, powiedzmy, że jesteś właścicielem hotelu i masz 50 pokoi, potrzebujesz sposobu na przechowywanie nazwiska tego, kto przebywa w którym pokoju, więc reprezentacja jak poniżej:

Lista nazwisk

aby to zrobić, Python musi przestrzegać warunku ciągłej przestrzeni pamięci do przydzielenia. Ale jak to zrobić, gdy nazwy mają różne długości (różne długości oznaczają różne wymagania dotyczące miejsca)?

Jednym z rozwiązań byłoby znalezienie długości największego łańcucha i przydzielenie wystarczającej ilości miejsca w pamięci dla wszystkich, ale nie będzie to wydajne pod względem pamięci, ponieważ część miejsca zostanie zmarnowana, a co, jeśli pojawi się nowy ciąg, który jest teraz największym ciągiem?

Aby rozwiązać ten problem, Python tworzy tablicę ciągłych odniesień do wielu obiektów, więc teraz, nawet jeśli rozmiar każdego pojedynczego obiektu może się różnić, pamięć używana do przechowywania jego adresu pamięci jest taka sama. W ten sposób Python gwarantuje stały czas dostępu do różnych elementów tablicy. Ten typ tablicy nazywamy tablicą referencyjną.

Aby to zilustrować, spójrz na ten obraz:

Ilustracja tablicy referencyjnej

Listy i krotki w Pythonie używają tego typu tablic do przechowywania danych.

Uwaga: Ponieważ tablice referencyjne wskazują na odniesienia, należy zachować ostrożność podczas zmiany wartości referencyjnych, ponieważ można również przypadkowo zmodyfikować wartości na listach. Również podczas tworzenia kopii upewnij się, że znasz różnicę między kopią płytką a głęboką .

Kompaktowe tablice

Wcześniej mówiliśmy o ciągach znaków i sposobie ich przechowywania w tablicy ciągłej pamięci, w rzeczywistości nazywamy tę tablicę tablicą kompaktową.

Zaletą używania tablic kompaktowych w porównaniu z tablicami referencyjnymi jest brak dodatkowych narzutów związanych z przechowywaniem odniesień do pamięci, bezpośrednio przechowujemy dane podstawowe. Kolejną zaletą, o której warto wspomnieć, jest to, że w przypadku użycia listy, która jest tablicą referencyjną, Python nie ma kontroli nad tym, gdzie przechowywane są dane, mimo że lista zawiera odniesienia do miejsca, w którym znajdują się dane. Ze względu na sposób działania sprzętu wydajniejsze jest umieszczanie danych blisko siebie, ponieważ mogą one zostać użyte do tych samych obliczeń.

Pomimo tych zalet, w przypadku list i krotek Python używa tablic referencyjnych, ponieważ są one wygodne w użyciu. Jeśli jednak nalegasz na użycie kompaktowej tablicy, Python udostępnia moduł o nazwie array , który pozwala to zrobić:

tworzenie kompaktowej tablicy w Pythonie

Tutaj zauważyłeś, że przekazaliśmy i jako pierwszy argument do array. Ponieważ aby utworzyć zwartą tablicę, musimy określić typ dla właściwej alokacji pamięci. W przypadku innych typów danych sprawdź tę tabelę:

Typy danych w tablicy

Jeśli chcesz dowiedzieć się więcej o module macierzowym kliknij tutaj .

Wadą modułu array jest to, że nie obsługuje typów danych zdefiniowanych przez użytkownika. Kompaktowe tablice o takiej strukturze danych można zdefiniować za pomocą modułu ctypes .

Tablice dynamiczne

Tworząc tablicę kompaktową, określamy dokładny rozmiar tej tablicy, aby komputer wiedział, jaką pamięć przydzielić. Ponieważ przydziela sąsiedni obszar pamięci innym tablicom.

W praktyce nie zawsze możemy znać rozmiar naszych tablic, z czasem mogą się one powiększać. Jako lekarstwo na ten problem, Python udostępnia abstrakcję zwaną tablicą dynamiczną.

Ta abstrakcja wykorzystuje instancję listy, która utrzymuje podstawową tablicę, która ma pojemność większą niż długość rzeczywistej listy. Ta dodatkowa pojemność pomaga nam dodawać coraz więcej danych do listy.

Kiedy ostatecznie wyczerpiemy dodatkową pojemność, tablica dynamiczna żąda nowej, większej tablicy i kopiuje wszystkie elementy do nowej tablicy, a system odzyskuje miejsce ze starej tablicy.

Lista Pythona jest oparta na tej abstrakcji, ale krotki i łańcuchy są niezmienne (nie można ich zmienić), dlatego nie są na tym oparte.

Warto również wspomnieć, że tablica dynamiczna nie tylko powiększa się, ale może się również kurczyć, jeśli usuniemy elementy z listy.

Listy i krotki

Tak więc z analizy, którą przeprowadziliśmy w powyższej sekcji, możemy podzielić metody list i krotek na dwa typy metod:

Niezmienne metody: metody, które istnieją zarówno w krotkach, jak i na listach i nie zmieniają ich zawartości. Poniżej znajduje się tabela tych metod i ich złożoność czasowa:

Niezmienna złożoność metod

Metody mutujące: metody, które istnieją tylko na listach, ponieważ zmieniają podstawowe dane i strukturę listy. Poniżej znajduje się tabela tych metod i ich złożoność czasowa:

Złożoność metod mutujących

Nie omawialiśmy tutaj, co robi każda metoda (jest intuicyjna i łatwa), ale możesz dowiedzieć się więcej o listach Pythona i krotkach .

Dania na wynos

  • Tablice referencyjne przechowują referencje w swojej pamięci tablicowej, a następnie uzyskują dostęp do rzeczywistych wartości poprzez referencje.
  • Kompaktowe tablice przechowują rzeczywiste dane w ciągłej pamięci.
  • Tablice dynamiczne to tablice, które automatycznie rozszerzają się i zmniejszają w zależności od liczby zawartych w nich elementów.
  • Listy są oparte na tablicach referencyjnych i dynamicznych.
  • Krotki są oparte na tablicach referencyjnych.
  • String oparte są na tablicach kompaktowych.

LinkedIn:https://www.linkedin.com/in/mohamed-aziz-belaweid/

GitHub:https://github.com/azayz

Przeczytaj inne moje historie:

DZIEDZINA: Wyszukiwanie rozszerzonego modelu językowego Wstępne szkolenie Rozpoznawanie emocji na twarzy, praktyczny przewodnik!

Subskrybuj i otrzymuj powiadomienia, gdy coś opublikuję: