請參考以下執行 -
import sys
_list = [2,55,87]
print(f'1 - Memory used by Python List - {sys.getsizeof(_list)}')
narray = np.array([2,55,87])
size = narray.size * narray.itemsize
print(f'2 - Memory usage of np array using itemsize - {size}')
print(f'3 - Memory usage of np array using getsizeof - {sys.getsizeof(narray)}')
這是我得到的結果
1 - Memory used by Python List - 80
2 - Memory usage of np array using itemsize - 12
3 - Memory usage of np array using getsizeof - 116
一種計算方法表明 numpy 陣列消耗的記憶體太少,但其他人說它消耗的記憶體比常規 python 串列多?我不應該在 numpy 陣列中使用 getSizeOf 嗎?我在這里做錯了什么?
編輯 - 我剛剛檢查過,一個空的 python 串列消耗了 56 個位元組,而一個空的 np 陣列消耗了 104 個位元組。這個空間是否用于指向相關的內置方法和屬性?
uj5u.com熱心網友回復:
計算使用:
size = narray.size * narray.itemsize
不包括陣列物件的非元素屬性消耗的記憶體。這可以通過以下檔案進行驗證ndarray.nbytes:
>>> x = np.zeros((3,5,2), dtype=np.complex128)
>>> x.nbytes
480
>>> np.prod(x.shape) * x.itemsize
480
在上面的鏈接中,可以看到ndarray.nbytes:
不包括陣列物件的非元素屬性消耗的記憶體。
請注意,從上面的代碼中,您可以得出結論,您的計算排除了非元素屬性,因為該值等于來自 的值ndarray.nbytes。
可以在Array Attributes部分中找到非元素屬性的串列,為了完整起見,包括此處:
ndarray.flags有關陣列記憶體布局的資訊。
ndarray.shape陣列維度的元組。
ndarray.strides遍歷陣列時要在每個維度中步進的位元組元組。
ndarray.ndim陣列維數。
ndarray.data指向陣列資料開頭的 Python 緩沖區物件。
ndarray.size陣列中的元素數。
ndarray.itemsize一個陣列元素的長度(以位元組為單位)。
ndarray.nbytes陣列元素消耗的總位元組數。
ndarray.base基礎物件,如果記憶體來自其他物件。
關于sys.getsizeof它可以在檔案(強調我的)中閱讀:
只考慮直接歸因于物件的記憶體消耗,而不是它所指物件的記憶體消耗。
uj5u.com熱心網友回復:
由于numpy陣列具有定義資料布局的形狀、步幅和其他成員變數,因此(可能)為此需要一些額外的記憶體是合理的!
list另一方面,A沒有特定的型別或形狀等。
但是,如果您開始在串列中添加元素而不是簡單地將它們寫為陣列,并且還使用更多的元素,例如 1e7,您將看到不同的行為!
請注意,不僅記憶體占用對應用程式的效率很重要!資料布局有時更為重要。
示例案例:
import numpy as np
import sys
N = int(1e7)
narray = np.zeros(N);
mylist = []
for i in range(N):
mylist.append(narray[i])
print("size of np.array:", sys.getsizeof(narray))
print("size of list :", sys.getsizeof(mylist))
在我的(華碩)Ubuntu 20.04 PC 上,我得到:
size of np.array: 80000104
size of list : 81528048
uj5u.com熱心網友回復:
搜索[numpy]getsizeof會產生許多潛在的重復項。
基本要點是:
串列是一個容器,
getsizeof檔案警告我們它只回傳容器的大小,而不是它參考的元素的大小。因此,它本身對于串列(或元組或字典)的總大小來說是不可靠的度量。getsizeof如果考慮到大約 100 個位元組的“開銷”,則是一個相當不錯的陣列度量。該開銷將是小陣列的重要組成部分,而在查看大陣列時則是次要的。nbytes是判斷陣列記憶體使用的更簡單方法。但是對于
views,資料緩沖區與基共享,并且在使用時不計算在內getsizeof。object dtype 陣列包含像串列這樣的參考,同樣的
getsizeof注意事項適用。
總的來說,我認為了解陣列和串列的存盤方式是判斷它們各自的記憶體使用情況的更有用的方法。更多地關注計算效率而不是記憶體使用。對于小東西和迭代使用,串列更好。當陣列很大時最好使用陣列方法進行計算。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/367999.html
