【发布时间】:2016-05-26 18:03:15
【问题描述】:
今天我分析了一个函数,发现了一个(至少对我而言)奇怪的瓶颈:使用mask=None 或mask=0 创建一个掩码数组以初始化一个全零但与data 形状相同的掩码是很慢:
>>> 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) 慢近2000 倍作为mask 参数?鉴于function docs 只说它:
必须可转换为与数据具有相同形状的布尔数组。 True 表示被屏蔽(即无效)的数据。
我在 Windows 10 上使用 python 3.5、numpy 1.11.0
【问题讨论】:
-
你挖到numpy代码了吗?
标签: python performance numpy