2014-11-05 10 views
5

Próbuję zrozumieć pamięć i inne ogólne implikacje, które przy użyciu list numpy będą miały dla tablic o dtypeobject w porównaniu do list list.Jakie są zalety/wady listy list w porównaniu do mnogiej tablicy OBJECTS w odniesieniu do MEMORY?

Czy to się zmienia z wymiarowaniem? np. 2D vs 3D vs N-D.

Niektóre z korzyści, jakie może myślę podczas korzystania numpy tablice są takie, że takie rzeczy jak .shape, .T i że można oddać je jako matryce z np.matrix znacznie szybciej.

Czy jest coś jeszcze?

Także, jeśli ktoś jest zainteresowany tym obiektem używam to:

import gmpy2 as gm 
gm.mpfr('0')           # <-- this is the object 

EDIT:

Wystarczy, aby wyjaśnić, że jestem zainteresowany w przypadku, gdy typ numpy tablica jest object nie natywny typ numpy.

EDYTUJ 2:

Odpowiednie kontynuowanie w odniesieniu do prędkości.

What are the benefits/drawbacks of a list of lists compared to a numpy array of OBJECTS with regards to SPEED?

+2

[To pytanie] (http://stackoverflow.com/q/993984/3923281) i jego odpowiedzi mogą być istotne ... –

+0

. 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

+0

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

Odpowiedz

8

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.)

+0

To jest bardzo interesujące i zgodne z tym, co uważałem za możliwe, +1. Byłbym zainteresowany dokładnymi wartościami wielkości luzu i ogólnego rozmiaru dla list/tablic obiektów. Jakieś wskazówki do tego, gdzie mogę to przeczytać? – eickenberg

+1

@eickenberg: Edytowałem odpowiedź. Ponieważ nie jest ona nigdzie udokumentowana, musisz wybrać implementację i wersję Pythona, które Cię interesują i przeczytać źródło. Połączyłem ze źródłem dla wersji trunkingowej CPython. – abarnert

+0

Tak, pięknie, bardzo dziękuję za te bardzo przydatne linki – eickenberg

Powiązane problemy