簡體   English   中英

Pandas Block Manager 如何提高性能?

[英]How is Pandas Block Manager improving performance?

Pandas 文檔說: BlockManager 的主要好處是提高了某些操作的性能(從 2D 數組構造、二進制操作、跨列減少),特別是對於寬數據幀。

由於一篇很棒的文章( https://uwekorn.com/2020/05/24/the-one-pandas-internal.html ),我以為我理解了 BlockManager 如何提高性能,但我意識到在例子。

如果我糾正示例中的錯誤:

a1 = np.arange(128 * 1024 * 10124)
a2 = np.arange(128 * 1024 * 1024)
a_both = np.empty((2, a1.shape[0]))
a_both[0, :] = a1
a_both[1, :] = a2
%timeit a1 + a2
%timeit np.sum(a_both, axis=0)

#Result :
895 ms ± 204 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
1.09 s ± 35.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

似乎在 numpy 數組中分組數據並不能提高性能。

Pandas BlockManger 是否在 2022 年仍在提高性能? 如果有人可以通過使用 numpy 的示例來說明那些“改進的性能”,那就太好了......(如何對數據進行分組或在內存中使用特定的數據布局可以提高性能)

長話短說:您需要處理 20 多個列才能從 BlockManager 中受益於列的加法/乘法。

實際上,我錯過了 Pandas 文檔中的一個很好的解釋:

什么是 BlockManager,它為什么存在?

其原因並不是真正的內存布局問題(NumPy 用戶知道連續內存訪問如何產生更好的性能),而是依賴 NumPy 的二維數組操作來執行 pandas 的計算。 因此,要在全數字 DataFrame 上執行任何面向行的操作,pandas 會將所有列連接在一起(使用 numpy.vstack 或 numpy.hstack),然后使用數組廣播或 ndarray.sum 之類的方法(與 np.isnan 結合使用)缺失數據)來執行某些操作。

BlockManager 的另一個動機是能夠從二維 NumPy 數組創建具有零副本的 DataFrame 對象。

https://github.com/pydata/pandas-design/blob/master/source/internal-architecture.rst#what-is-blockmanager-and-why-does-it-exist

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM