2014-12-19 2 views
8

numpy.zeros가 그러한 작은 공간을 차지하는 이유가 궁금합니다.numpy.zeros가 약간의 공간을 차지하는 이유

x = numpy.zeros(200000000) 

이 더 메모리 동안을 차지하지

x = numpy.repeat(0,200000000) 

는 1.5GB 주위를 차지한다. numpy.zeros는 빈 포인터의 배열을 생성합니까? 그렇다면 cython에서 포인터를 변경 한 후 포인터를 배열에서 다시 공백으로 설정하는 방법이 있습니까? 내가 사용하는 경우 :

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

메모리 사용량이 늘어납니다. 값을 변경 한 다음 원래 파이썬이나 cython에서 numpy.zeros 형식으로 다시 변경하는 방법이 있습니까?

+2

각 어레이가 사용하는 메모리를 어떻게 측정하고 있습니까? 'x = numpy.zeros (200000000)'이면 내 컴퓨터에서'x.nbytes'는'1600000000'입니다. 'x = numpy.repeat (0, 200000000) '의 경우 메모리의 절반이 사용됩니다 (배열을 생성 할 때'float64' 데이터 유형 대신 int32' 데이터 유형이 사용됩니다). –

+1

[Python에서 객체의 크기를 어떻게 결정합니까?] (http://stackoverflow.com/q/449560/2359271) ([this answer] (http://stackoverflow.com/a/)에 특히주의하십시오. 3373511/2359271)) – Air

+0

액티비티 모니터의 변경 사항을 보았습니다. – user3266890

답변

15

Linux를 사용하고 있습니까? 리눅스는 메모리를 게으르게 할당하고있다. numpy의 malloccalloc에 대한 기본 호출은 항상 '성공'합니다. 메모리가 처음 액세스 될 때까지 메모리는 실제로 할당되지 않습니다.

zeros 함수는 calloc을 사용하여 할당 메모리가 처음 액세스되기 전에 0으로 설정됩니다. 따라서 numpy는 명시 적으로 배열을 0으로 만들 필요가 없으므로 배열을 지연 초기화합니다. 반면, repeat 함수는 calloc을 사용하여 배열을 초기화 할 수 없습니다. 대신 malloc을 사용하고 배열의 모든 요소에 반복 된 내용을 복사해야하므로 즉각적인 할당이 이루어집니다.

관련 문제