2015-07-19 59 views
2

在迭代算法中,多次使用大numpy數組是很常見的。通常情況下,陣列需要在每次迭代時手動「重置」。填充現有數組(使用nans還是0)和創建新數組之間是否存在性能差異?如果是這樣,爲什麼?填充現有numpy數組和創建新數組之間的性能差異

+3

要知道是否存在性能差異的唯一方法是測量它。 – juanchopanza

+0

如果事先已知,預先爲結果預先分配必要空間通常會有很大的好處。通常可以使用'np.empty'來分配它。如果算法在列表中累計較小的數組,最終轉換爲大數組可能仍然比預分配慢。這肯定與numpy內部的內存處理有關。 – eickenberg

+0

重置的目的是什麼?它是否將數組設置爲某個初始值(在這種情況下NaN看起來是一個奇數值)?否則,不需要重置數組,只需覆蓋執行期間存在的任何值即可。 – Evert

回答

1

答案取決於你的數組的大小。雖然分配新的內存區域需要幾乎固定的時間,但填充此內存區域的時間隨着大小而線性增長。 但是,使用numpy.zeros填充新分配的內存幾乎是使用numpy.fill填充現有陣列的兩倍,比項目設置x[:] = 0快了三倍。

所以在我的機器上,填充少於800個元素的向量比創建新向量要快,超過800個元素創建新向量的速度會更快。

+0

丹尼爾,任何想法爲什麼'numpy.zeros'會更快更大的數組? 'numpy.ones'會發生同樣的情況嗎? (在我的系統btw中,使用了一個MBA i5並使用'np.float'數組,我甚至可以在20000的數組大小的情況下破解。另外,'numpy.ones'對我來說總是比'numpy.fill(1)'慢,所以它可能是這個盈虧平衡的'零()'和'填充(0)'只出現0.) – Evert

+1

只有'零'具有特殊的實現。 'ones'是通過'empty'和'fill(1)'實現的。 – Daniel