【Python】小談 numpy 數組佔用內存空間問題

之前跟同學討論過numpy數組的佔用空間大小問題,但是今天給忘了,又重新試驗了一下,主要是利用sys模塊的getsizeof函數,使用的版本是 Python3.5。記錄下來,以備後忘。


問題

  1. 一個空的numpy數組對象佔用多大空間。
  2. 一個int32int64float32float64數佔用多大空間。

代碼

import numpy as np
import sys

# 32位整型
ai32 = np.array([], dtype=np.int32)
bi32 = np.arange(1, dtype=np.int32)
ci32 = np.arange(5, dtype=np.int32)

# 64位整型
ai64 = np.array([], dtype=np.int64)
bi64 = np.arange(1, dtype=np.int64)
ci64 = np.arange(5, dtype=np.int64)

# 32位浮點數
af32 = np.array([], dtype=np.float32)
bf32 = np.arange(1, dtype=np.float32)
cf32 = np.arange(5, dtype=np.float32)

# 64位浮點數
af64 = np.array([], dtype=np.float64)
bf64 = np.arange(1, dtype=np.float64)
cf64 = np.arange(5, dtype=np.float64)

print("size of 0 int32 number: %f" % sys.getsizeof(ai32))
print("size of 1 int32 number: %f" % sys.getsizeof(bi32))
print("size of 5 int32 numbers: %f" % sys.getsizeof(ci32), end='\n\n')

print("size of 0 int64 number: %f" % sys.getsizeof(ai64))
print("size of 1 int64 number: %f" % sys.getsizeof(bi64))
print("size of 5 int64 numbers: %f" % sys.getsizeof(ci64), end='\n\n')

print("size of 0 float32 number: %f" % sys.getsizeof(af32))
print("size of 1 float32 number: %f" % sys.getsizeof(bf32))
print("size of 5 float32 numbers: %f" % sys.getsizeof(cf32), end='\n\n')

print("size of 0 float64 number: %f" % sys.getsizeof(af64))
print("size of 1 float64 number: %f" % sys.getsizeof(bf64))
print("size of 5 float64 numbers: %f" % sys.getsizeof(cf64))

結果

size of 0 int32 number: 96.000000
size of 1 int32 number: 100.000000
size of 5 int32 numbers: 116.000000

size of 0 int64 number: 96.000000
size of 1 int64 number: 104.000000
size of 5 int64 numbers: 136.000000

size of 0 float32 number: 96.000000
size of 1 float32 number: 100.000000
size of 5 float32 numbers: 116.000000

size of 0 float64 number: 96.000000
size of 1 float64 number: 104.000000
size of 5 float64 numbers: 136.000000

以上結果說明:

  1. 一個空的 numpy 數組,無論什麼類型,都是佔用 96 個字節(byte)。
  2. 一個 int32 和一個 float32 都是佔用 4 個字節,而64位的都佔用 8 個字節。

其他類型佔用空間大小可以採用類似代碼進行測試。

此外,注意 sys.getsizeof() 函數返回的是 這個對象所佔用的空間大小,對於數組來說,除了數組中每個值佔用空間外,數組對象還會存儲數組長度、數組類型等其他信息。而如果只想要獲取數組中存儲的值的佔用空間大小,可以使用 numpy.ndarray.nbytes ,使用 numpy.ndarray.itemsize 獲取數組中每個值的佔用空間大小。

ci32.nbytes    # 20
ci32.itemsize    # 4

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章