mam zamiar odpowiedzieć na pierwotne pytanie, i zostawić resztę (wydajność transpozycji itd.) Na zewnątrz. Więc:
Próbuję zrozumieć, pamięć i inne implikacje napowietrznych, że za pomocą NumPy list miałby ... Właśnie w celu wyjaśnienia, że jestem zainteresowany w przypadku, gdy numpy typ tablicy jest object
nie float
, double
lub int
lista Pythona jest tablicą wskaźników do obiektów Pythona zawijania co rzeczywiste wartości już w nim przechowywanych-plus kilka dodatkowych luzu aby mogła ona zostać rozszerzona na bieżąco skutecznie. Nazwijmy to zmniejszeniem o 20%, tylko ze względu na łatwe obliczenia. Na przykład lista 10000 32-bitowych liczb całkowitych zajmuje, powiedzmy, 96000 bajtów dla tablicy, plus około 240000 bajtów dla obiektów całkowitych Python oraz niewielki narzut dla samej listy, powiedzmy 80 bajtów ponownie.
Tablica NumPy to tablica wszystkich rzeczywistych wartości, które zostały w niej zapisane. Na przykład tablica 10000 32-bitowych liczb całkowitych zajmuje 40000 bajtów, a także niewielki narzut dla samej tablicy, powiedzmy 80 bajtów. Ale kiedy używasz dtype object
, każda "rzeczywista wartość" jest po prostu wskaźnikiem do obiektu Pythona, tak jak z list
.
Tak więc jedyną różnicą jest tutaj luzu: tablica będzie używać 320080 bajtów, podczas gdy lista będzie używać 336080 bajtów. Nie jest to wielka różnica, ale może mieć znaczenie.
także, czy jedno się szybciej niż inne 2D vs ND lub wielkości wzdłuż określonego wymiaru.
Tak, lista zagnieżdżona wzrośnie szybciej ... ale nie o ogromną ilość.
Tablica wielowymiarowa w numpy jest przechowywana jako jeden olbrzymi macierzy (w C lub Fortran celu kroczącego), a więc czy kształt (10000,)
, (100, 100)
lub (10, 10, 10, 10)
, jest tej samej wielkości. (Narzut może powiększyć o kilka bajtów więcej informacji o krokach, ale jeśli mówimy o, powiedzmy, 256 bajtów w porównaniu z 80 na 320K, kogo to obchodzi?)
Lista zagnieżdżona, na z drugiej strony, ma więcej list, z luzem i narzutem na każdym poziomie. Na przykład lista 10 list 10 list z 10 listami całkowitymi zawiera 1 + 10 + 100 + 1000 tablic 12 wskaźników i 1 + 10 + 100 + 1000 nagłówków list.
Tak, tablica jest wciąż przy 320080 bajtów, a może 320256, ale lista jest za pomocą 435536.
Jeśli chcesz wiedzieć więcej o tym, jak list
realizowany jest ... dobrze, że zależy od implementacja, z której korzystasz. Ale w CPython, C API w znacznym stopniu gwarantuje, że będzie przechowywać ciągły zestaw PyObject *
, a fakt, że dołączanie jest amortyzowane stałym czasem, wymaga, aby pozostało ono proporcjonalnie rosnące. I można zobaczyć w the headers i the source, że to jest dokładnie to, co robi. (Pamiętaj też, że konkretne rozmiary, które otrzymasz z tego źródła, będą generalnie zależały od platformy, na której ją skompilujesz. Co najważniejsze, ponieważ w całym miejscu znajdują się wskaźniki, platformy 64-bitowe mają zwykle wartość od 50 do 100 % więcej kosztów na obiekt dla większości obiektów niż platformy 32-bitowe.)
[To pytanie] (http://stackoverflow.com/q/993984/3923281) i jego odpowiedzi mogą być istotne ... –
. choć martwi mnie to, że numpy jest szybszy w przypadku punktów zmiennoprzecinkowych, ale co się dzieje, gdy masz obiekty zamiast punktów zmiennoprzecinkowych? Czy tablica numpy jest nieaktywna do listy list? – evan54
To wydaje się zbyt szerokie pytanie. Jest tutaj kilka konkretnych pytań, takich jak porównywanie użycia pamięci, powiedzmy, 10x10x10x10, 100x100 i 10000 tablicy int32 w porównaniu do równoważnej zagnieżdżonej listy int, ale każdy z nich zasługuje na własne pytanie. – abarnert