getsizeof
имеет ограниченное значение. Это может быть далеко для списков. Для массивов это лучше, но вы должны понимать, как хранятся массивы.
In [447]: import sys
In [448]: a = np.arange(100)
In [449]: sys.getsizeof(a)
Out[449]: 896
Но посмотрите на size
из view
:
In [450]: b = a.reshape(10,10)
In [451]: sys.getsizeof(b)
Out[451]: 112
Показывает размер объекта массива, но не размер общего буфера данных. b
не имеет собственного буфера данных.
In [453]: a.size
Out[453]: 100
In [454]: b.size
Out[454]: 100
Так что я предполагаю, что ваши a
и b
являются представлениями некоторых других массивов. Но конкатенация создает новый массив со своим собственным буфером данных. Это не может быть вид на другие два. Так что это getsizeof
отражает это.
In [457]: c = np.concatenate((a,b.ravel()))
In [459]: c.shape
Out[459]: (200,)
In [460]: c.size
Out[460]: 200
In [461]: sys.getsizeof(c)
Out[461]: 1696
Буфер данных для a
составляет 100 * 8 байт, поэтому «издержки» равны 96. Для c
, 200 * 8, опять же, с 96 «служебными данными».