今天我描述了一個函數,我發現了一個(至少對我來說)奇怪的瓶頸:用mask=None
或mask=0
創建一個蒙版數組來初始化一個蒙版與所有零,但相同的形狀data
很慢:爲什麼用mask = None或mask = 0創建一個非常緩慢的蒙版numpy數組
>>> import numpy as np
>>> data = np.ones((100, 100, 100))
>>> %timeit ma_array = np.ma.array(data, mask=None, copy=False)
1 loop, best of 3: 803 ms per loop
>>> %timeit ma_array = np.ma.array(data, mask=0, copy=False)
1 loop, best of 3: 807 ms per loop
使用mask=False
或手工創建的面具另一方面要快得多:
>>> %timeit ma_array = np.ma.array(data, mask=False, copy=False)
1000 loops, best of 3: 438 µs per loop
>>> %timeit ma_array = np.ma.array(data, mask=np.zeros(data.shape, dtype=bool), copy=False)
1000 loops, best of 3: 453 µs per loop
爲什麼給None
或0
幾乎比False
或np.zeros(data.shape)
慢0123倍作爲mask
參數?鑑於function docs只說明它:
必須可轉換爲與數據形狀相同的布爾值數組。 True表示蒙面(即無效)數據。
我使用Python 3.5,numpy的1.11.0在Windows 10
你有沒有深入研究numpy代碼呢? –