3 回答

TA貢獻1784條經(jīng)驗 獲得超7個贊
NumPy的數(shù)組比Python列表更緊湊-您在Python中描述的列表列表至少需要20 MB左右,而單元格中具有單精度浮點數(shù)的NumPy 3D數(shù)組則需要4 MB。使用NumPy可以更快地訪問讀寫項目。
也許您只關(guān)心一百萬個單元格就不會那么在意,但是您肯定會關(guān)心十億個單元格-這兩種方法都不適合32位體系結(jié)構(gòu),但是如果使用64位版本,NumPy可以節(jié)省大約4 GB的內(nèi)存,僅Python一項就至少需要12 GB(很多指針的大小加倍),這是一個昂貴得多的硬件!
差異主要是由于“間接性”造成的-Python列表是指向Python對象的指針的數(shù)組,每個指針至少4個字節(jié),對于最小的Python對象也至少包含16個字節(jié)(類型指針為4,引用計數(shù)為4,類型為4值-內(nèi)存分配器舍入為16)。NumPy數(shù)組是統(tǒng)一值的數(shù)組-單精度數(shù)字每個占用4個字節(jié),雙精度數(shù)字每個占用8個字節(jié)。靈活性較差,但是您要為標準Python列表的靈活性付出高昂的代價!

TA貢獻1799條經(jīng)驗 獲得超8個贊

TA貢獻1775條經(jīng)驗 獲得超11個贊
Andarray將其數(shù)據(jù)存儲在連續(xù)的數(shù)據(jù)緩沖區(qū)中
例如,在我當(dāng)前的ipython會話中:
In [63]: x.shape
Out[63]: (35, 7)
In [64]: x.dtype
Out[64]: dtype('int64')
In [65]: x.size
Out[65]: 245
In [66]: x.itemsize
Out[66]: 8
In [67]: x.nbytes
Out[67]: 1960
被引用的數(shù)組x具有一個內(nèi)存塊,其信息類似于shape和strides,并且此數(shù)據(jù)緩沖區(qū)占用1960字節(jié)。
識別列表的內(nèi)存使用情況例如xl = x.tolist()比較棘手。 len(xl)是35,也就是說,它的數(shù)據(jù)緩沖區(qū)有35個指針。但是每個指針都引用7個元素的不同列表。這些列表中的每一個都有指向數(shù)字的指針。在我的示例中,數(shù)字都是小于255的整數(shù),因此每個數(shù)字都是唯一的(重復(fù)指向同一對象)。對于較大的整數(shù)和浮點數(shù),每個整數(shù)都有一個單獨的Python對象。因此,列表的內(nèi)存占用量取決于嵌套的程度以及各個元素的類型。
ndarray也可以具有objectdtype,在這種情況下,它也包含指向內(nèi)存中其他位置的對象的指針。
還有另一個細微差別-列表的主指針緩沖區(qū)的大小略大,以使其append更快。
添加回答
舉報