我想創建一個小的NumPy整數來節省內存。然而,我注意到爲什麼sys.getsizeof(numpy.int8(1))返回12?
import numpy,sys
print sys.getsizeof(numpy.int8(1))
12
打印,因此它似乎是numpy.int8()
產生12個字節而不是1個字節的數據。爲什麼是這樣?
我想創建一個小的NumPy整數來節省內存。然而,我注意到爲什麼sys.getsizeof(numpy.int8(1))返回12?
import numpy,sys
print sys.getsizeof(numpy.int8(1))
12
打印,因此它似乎是numpy.int8()
產生12個字節而不是1個字節的數據。爲什麼是這樣?
Numpy標量具有與CPython數據類型類似的實現,例如python float或integer類型。換句話說,它是含有三個變量的結構體:
類型int
一個指針,它的對象類型
可變
在32位體系結構中,引用計數器和指針通常都是4個字節。值字段原則上可以是任何大小,但structure padding將導致結構分配4個字節,即使值需要更少。
如果您正在使用64位體系結構,請將「4個字節」替換爲「8個字節」。
所以,在32位系統上的所有numpy的整數組成(有效)三個4字節的變量,並且sys.getsizeof(numpy.int8(1))
給出12在64位系統上,它會返回24
大多數numpy的標量是相同的大小。一個例外是numpy.complex
類型,它通常需要雙重存儲。由於這與內存中的其他兩個變量保持一致,所以可以忽略填充並簡單地將爲該值分配的字節加倍,從而分別給出16位和32位32位和64位字節。類似的規則適用於更奇特的類型(complex256
,float80
等)
在python中,所有對象都有很多開銷(試着做'dir(numpy.int8(1))'如果你真的擔心爲了節省內存,你應該使用一個數組來分配在python中創建一個對象的固定成本 – 2012-04-29 04:05:28
你可能會對'nbytes'和'itemsize'的輸出感興趣:例如'numpy.arange(10000 ,dtype = numpy.int8).itemsize == 1'和'numpy.arange(10000,dtype = numpy.int32).nbytes == 40000'。 – DSM 2012-04-29 04:14:30