Jakie są zalety NumPy nad zwykłymi listami Pythona?
Jakie są zalety NumPy nad zwykłymi listami Pythona?
Mam około 100 serii rynków finansowych i zamierzam stworzyć tablicę sześcianów o wymiarach 100x100x100 = 1 milion komórek. Będę regresował (3-zmienną) każde X Z Każdym y i z, aby wypełnić tablicę standardowymi błędami.
Słyszałem, że dla" dużych macierzy " powinienem używać NumPy w przeciwieństwie do list Pythona, ze względu na wydajność i skalowalność. Rzecz w tym, że znam listy Pythona i wydają się pracować dla mnie.
Jakie będą korzyści, jeśli przeniosę się do NumPy?
A gdybym miał serię 1000 (czyli miliard komórek zmiennoprzecinkowych w sześcianie)?
5 answers
Tablice NumPy są bardziej kompaktowe niż listy Pythona-lista list, jak opisujesz, w Pythonie zajmuje co najmniej 20 MB, podczas gdy tablica NumPy 3D z pojedynczą precyzją pływaków w komórkach zmieściłaby się w 4 MB. Dostęp do odczytu i zapisu elementów jest również szybszy dzięki NumPy.
Może nie zależy ci tak bardzo na milionie komórek, ale zdecydowanie na miliard komórek - żadne podejście nie zmieściłoby się w architekturze 32-bitowej, ale z 64-bitowymi kompilacjami NumPy uciekłby z 4 GB lub tak, Python sam potrzebuje co najmniej o 12 GB ( wiele wskaźników, które dwukrotnie w rozmiarze) - znacznie droższy kawałek sprzętu!
Różnica wynika głównie z "indirectness" - lista Pythona jest tablicą wskaźników do obiektów Pythona, co najmniej 4 bajty na wskaźnik plus 16 bajtów dla nawet najmniejszego obiektu Pythona (4 dla wskaźnika typu, 4 dla liczby odniesień, 4 dla wartości -- a alokatory pamięci zaokrąglają się do 16). Tablica NumPy jest tablicą jednorodnych wartości -- liczby pojedynczej precyzji zajmują po 4 bajty każda, liczby podwójnej precyzji po 8 bajtów. Mniej elastyczne, ale płacisz znacznie za elastyczność standardowych list Pythona!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-29 11:55:46
NumPy jest nie tylko bardziej wydajny, ale także wygodniejszy. Dostajesz za darmo wiele operacji wektorowych i macierzowych, które czasami pozwalają uniknąć niepotrzebnej pracy. I są one również skutecznie realizowane.
Na przykład możesz odczytać swoją kostkę bezpośrednio z pliku do tablicy:
x = numpy.fromfile(file=open("data"), dtype=float).reshape((100, 100, 100))
Suma wzdłuż drugiego wymiaru:
s = x.sum(axis=1)
Znajdź, które komórki są powyżej progu:
(x > 0.5).nonzero()
Usuń każdy parzysty kawałek wzdłuż trzeciego wymiar:
x[:, :, ::2]
Również wiele użytecznych bibliotek działa z tablicami NumPy. Na przykład biblioteki analizy statystycznej i wizualizacji.
Nawet jeśli nie masz problemów z wydajnością, nauka NumPy jest warta wysiłku.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-28 01:53:30
Alex wspomniał o wydajności pamięci, a Roberto o wygodie, i to są dobre punkty. Jeśli chodzi o kilka pomysłów, wspomnę o Prędkości i funkcjonalności .
Funkcjonalność: masz wiele wbudowanych w NumPy, FFTs, sploty, szybkie wyszukiwanie, podstawowe statystyki, algebrę liniową, histogramy itp. I naprawdę, kto może żyć bez FFT?
Speed: Oto test na robienie sumy nad listą i tablicą NumPy, pokazujący, że suma na tablicy NumPy jest 10x szybciej ( w tym teście-przebieg może się różnić).
from numpy import arange
from timeit import Timer
Nelements = 10000
Ntimeits = 10000
x = arange(Nelements)
y = range(Nelements)
t_numpy = Timer("x.sum()", "from __main__ import x")
t_list = Timer("sum(y)", "from __main__ import y")
print("numpy: %.3e" % (t_numpy.timeit(Ntimeits)/Ntimeits,))
print("list: %.3e" % (t_list.timeit(Ntimeits)/Ntimeits,))
Które na moich systemach (podczas uruchamiania backupu) daje:
numpy: 3.004e-05
list: 5.363e-04
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-01 18:18:30
Oto fajna odpowiedź z FAQ na scipy.org strona internetowa :
Jakie zalety oferują tablice NumPy nad (zagnieżdżonymi) listami Pythona?
Listy Pythona są wydajnymi kontenerami ogólnego przeznaczenia. Wspierają (dość) skuteczne wstawianie, usuwanie, dodawanie i łączenie, a składanie list w Pythonie ułatwia ich konstruowanie i manipulować. Mają jednak pewne ograniczenia: nie obsługują "wektoryzowane" operacje takie jak dodawanie i mnożenie elementów, a fakt, że mogą zawierać przedmioty różnego typu oznacza że Python musi przechowywać informacje o typie dla każdego elementu i musi wykonaj kod wysyłający Typ podczas pracy na każdym elemencie. To oznacza to również, że bardzo niewiele operacji listowych może być wykonanych przez wydajne pętle C – każda iteracja wymagałaby kontroli typu i innych Księgowość API Pythona.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-19 15:17:38
Wszystkie podkreśliły prawie wszystkie główne różnice między tablicami numpy i listą Pythona, powiem tylko o nich tutaj:
Tablice Numpy mają stały rozmiar podczas tworzenia, w przeciwieństwie do list Pythona (które mogą rosnąć dynamicznie). Zmiana rozmiaru ndarray spowoduje utworzenie nowej tablicy i usunięcie oryginału.
-
Elementy tablicy Numpy muszą być tego samego typu danych (możemy mieć również Typ heterogeniczny, ale to nie pozwoli operacje matematyczne) i tym samym będzie taka sama wielkość w pamięci
-
Tablice Numpy są ułatwione postępy matematyczne i inne rodzaje operacji na dużej liczbie danych. Zazwyczaj takie operacje są wykonywane bardziej efektywnie i z mniejszą ilością kodu niż jest to możliwe przy użyciu Pythonów zbudowanych w sekwencjach
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-05 12:46:45