2014-12-19 7 views
8

Zastanawiam się, dlaczego numpy.zeros zajmuje tak mało miejsca?Dlaczego numpy.zeros zajmuje niewiele miejsca?

x = numpy.zeros(200000000) 

ta nie zajmuje czasu, pamięci,

x = numpy.repeat(0,200000000) 

zajmuje około 1,5 GB. Czy numpy.zeros tworzy tablicę pustych wskaźników? Jeśli tak, czy istnieje sposób, aby ustawić wskaźnik z powrotem na pusty w tablicy po zmianie w cytoncie? Jeśli użyję:

x = numpy.zeros(200000000) 
x[0:200000000] = 0.0 

Zużycie pamięci rośnie. Czy istnieje sposób na zmianę wartości, a następnie zmianę jej z powrotem na format numpy.zeros, który pierwotnie miał on w pythonie lub cytoncie?

+2

W jaki sposób mierzysz pamięć używaną przez każdą tablicę? Jeśli 'x = numpy.zeros (200000000)' to 'x.nbytes' to' 1600000000' na moim komputerze. Dla 'x = numpy.repeat (0, 200000000)' używana jest połowa pamięci (typ danych 'int32' zamiast typu danych' float64' jest używany podczas tworzenia tablicy). –

+1

[Jak określić rozmiar obiektu w języku Python?] (Http://stackoverflow.com/q/449560/2359271) (zwróć szczególną uwagę na [tę odpowiedź] (http://stackoverflow.com/a/ 3373511/2359271)) – Air

+0

Właśnie obserwowałem zmianę w monitorze aktywności – user3266890

Odpowiedz

15

Czy używasz systemu Linux? Linux ma leniwy przydział pamięci. Podstawowe wywołania do malloc i calloc w numpy zawsze kończą się sukcesem. Żadna pamięć nie jest przydzielana do momentu pierwszego dostępu do pamięci.

Funkcja zeros użyje calloc, która zeruje przydzieloną pamięć przed pierwszym uzyskaniem dostępu. Dlatego numpy nie musi jawnie wyzerowywać tablicy, więc tablica będzie leniwie inicjowana. Podczas gdy funkcja repeat nie może polegać na calloc, aby zainicjować tablicę. Zamiast tego musi użyć malloc, a następnie skopiować powtarzane do wszystkich elementów w tablicy (co wymusza natychmiastową alokację).