Zasadniczo listy w języku Python są bardzo elastyczne i mogą przechowywać całkowicie heterogeniczne, dowolne dane, i można je bardzo skutecznie dołączać w zamortyzowanym stałym czasie . Jeśli chcesz zmniejszyć i rozbudować listę w sposób wydajny i bezproblemowy, są na to. Ale oni wykorzystywać przestrzeń dużo więcej niż macierze C .
Z array.array
drugiej strony ten typ jest po prostu cienkim opakowaniem na tablicach C. Może przechowywać tylko jednorodne dane, wszystkie tego samego typu, a więc wykorzystuje tylko sizeof(one object) * length
bajty pamięci. Przeważnie powinieneś go używać, gdy chcesz wystawić tablicę C na rozszerzenie lub wywołanie systemowe (na przykład ioctl
lub fctnl
).
array.array
jest również rozsądnym sposobem reprezentowania łańcucha zmiennego w Pythonie 2.x ( array('B', bytes)
). Jednak Python 2.6+ i 3.x oferują zmienny ciąg bajtów jako bytearray
.
Jeśli jednak chcesz wykonywać matematykę na jednorodnej tablicy danych liczbowych, znacznie lepiej jest użyć NumPy, który może automatycznie wektoryzować operacje na złożonych tablicach wielowymiarowych.
Krótko mówiąc : array.array
jest przydatny, gdy potrzebujesz jednorodnej tablicy danych C z powodów innych niż matematyka .
sizeof(element)
× (liczba elementów) bajtów plus mały stały nagłówek narzutu. Jednak ndarray ma kilka zaawansowanych opcji radzenia sobie z nieciągłymi i rzadkimi tablicami i myślę, że niektóre wtykowe strategie alokacji pamięci dla dużych tablic ... niektóre z tych zaawansowanych funkcji sprawią, że będzie mniej pamięci użytkownika , podczas gdy inne poprawią wydajność poprzez użycie więcej pamięć.W prawie wszystkich przypadkach normalna lista jest właściwym wyborem. Moduł tablic przypomina bardziej cienkie opakowanie nad tablicami C, które dają rodzaj silnie typowanych kontenerów (patrz dokumenty ), z dostępem do bardziej podobnych do C typów, takich jak podpisane / niepodpisane krótkie lub podwójne, które nie są częścią wbudowanego -w typach. Powiedziałbym, że używaj modułu tablic tylko wtedy, gdy naprawdę go potrzebujesz, we wszystkich innych przypadkach trzymaj się list.
źródło
array
jest przeznaczony do robienia matematyki . Jeśli spróbujesz NumPyndarray
do zsumowania tablicy 10 ^ 8 liczb, to całkowicie rozwalilist
. @tzot ma słuszne wyobrażenie o tym, dlaczego wbudowane funkcjearray
matematyczne są wolne.Moduł macierzowy jest jedną z tych rzeczy, których prawdopodobnie nie potrzebujesz, jeśli nie wiesz, dlaczego go użyjesz (i zauważ, że nie próbuję tego powiedzieć protekcjonalnie!) . Przez większość czasu moduł tablicowy służy do interfejsu z kodem C. Aby udzielić bardziej bezpośredniej odpowiedzi na pytanie dotyczące wydajności:
W niektórych zastosowaniach tablice są bardziej wydajne niż listy. Jeśli musisz przydzielić tablicę, której WIEDZIE nie zmieni, tablice mogą być szybsze i zużywać mniej pamięci. GvR ma anegdotę dotyczącą optymalizacji, w której moduł macierzy okazuje się zwycięzcą (długi odczyt, ale warto).
Z drugiej strony, jednym z powodów, dla których listy pochłaniają więcej pamięci niż tablice, jest to, że Python przydzieli kilka dodatkowych elementów, gdy wszystkie przydzielone elementy zostaną wykorzystane. Oznacza to, że dodawanie elementów do list jest szybsze. Więc jeśli planujesz dodać elementy, lista jest właściwą drogą.
TL; DR Użyłbym tablicy tylko wtedy, gdy potrzebujesz wyjątkowej optymalizacji lub potrzebujesz interfejsu z kodem C (i nie możesz używać pyrex ).
źródło
zalety każdego z nich:
lista
tablica (np. tablica numpy)
źródło
Rozumiem, że tablice są przechowywane bardziej wydajnie (tj. Jako ciągłe bloki pamięci vs. wskaźniki do obiektów Pythona), ale nie jestem świadomy żadnych korzyści w zakresie wydajności. Dodatkowo w przypadku tablic musisz przechowywać prymitywy tego samego typu, podczas gdy listy mogą przechowywać wszystko.
źródło
Standardowe tablice biblioteczne są przydatne do binarnych operacji we / wy, takich jak tłumaczenie listy liczb całkowitych na ciąg znaków do zapisu, powiedzmy, do pliku wave. To powiedziawszy, jak już wielu zauważyło, jeśli zamierzasz wykonać jakąkolwiek prawdziwą pracę, powinieneś rozważyć użycie NumPy.
źródło
Jeśli zamierzasz używać tablic, rozważ pakiety numpy lub scipy, które dają tablice o wiele większej elastyczności.
źródło
Tablicy można używać tylko do określonych typów, natomiast list można używać do dowolnego obiektu.
Tablice mogą również zawierać dane tylko jednego typu, podczas gdy lista może zawierać wpisy różnych typów obiektów.
Tablice są również bardziej wydajne w przypadku niektórych obliczeń numerycznych.
źródło
Ważną różnicą między tablicą numpy a listą jest to, że wycinki tablic są widokami oryginalnej tablicy. Oznacza to, że dane nie są kopiowane, a wszelkie modyfikacje widoku zostaną odzwierciedlone w tablicy źródłowej.
źródło
Ta odpowiedź podsumuje prawie wszystkie zapytania dotyczące tego, kiedy użyć List i Array:
Główną różnicą między tymi dwoma typami danych są operacje, które można na nich wykonać. Na przykład możesz podzielić tablicę przez 3, a ona podzieli każdy element tablicy przez 3. Tego samego nie można zrobić z listą.
Lista jest częścią składni Pythona, więc nie trzeba jej deklarować, a przed użyciem należy zadeklarować tablicę.
Możesz przechowywać wartości różnych typów danych na liście (heterogeniczne), podczas gdy w tablicy możesz przechowywać tylko wartości tylko tego samego typu danych (jednorodne).
Tablice są bogate w funkcje i szybkie, jest szeroko stosowane do operacji arytmetycznych i do przechowywania dużej ilości danych - w porównaniu do listy.
Tablice zajmują mniej pamięci w porównaniu do list.
źródło