2012-04-29 121 views
4

我想創建一個小的NumPy整數來節省內存。然而,我注意到爲什麼sys.getsizeof(numpy.int8(1))返回12?

import numpy,sys 
print sys.getsizeof(numpy.int8(1)) 

12打印,因此它似乎是numpy.int8()產生12個字節而不是1個字節的數據。爲什麼是這樣?

+7

在python中,所有對象都有很多開銷(試着做'dir(numpy.int8(1))'如果你真的擔心爲了節省內存,你應該使用一個數組來分配在python中創建一個對象的固定成本 – 2012-04-29 04:05:28

+10

你可能會對'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

回答

3

Numpy標量具有與CPython數據類型類似的實現,例如python float或integer類型。換句話說,它是含有三個變量的結構體:

  • 類型int

  • 一個指針,它的對象類型

  • 可變

  • 的值的一個實例的 reference counter

在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位字節。類似的規則適用於更奇特的類型(complex256float80等)