这是基于2018-10年提出的这个问题。
考虑下列代码。三个简单函数用于计算NumPy 3D数组(1000 x 1000 x 1000)中非零元素的数量。
import numpy as np
def f_1(arr):
return np.sum(arr > 0)
def f_2(arr):
ans = 0
for val in range(arr.shape[0]):
ans += np.sum(arr[val, :, :] > 0)
return ans
def f_3(arr):
return np.count_nonzero(arr)
if __name__ == '__main__':
data = np.random.randint(0, 10, (1_000, 1_000, 1_000))
print(f_1(data))
print(f_2(data))
print(f_3(data))
在我的电脑上执行时间(Python 3.7.?,Windows 10,NumPy 1.16.?):
%timeit f_1(data)
1.73 s ± 21.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit f_2(data)
1.4 s ± 1.36 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit f_3(data)
2.38 s ± 956 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
所以,f_2()
比f_1()
和f_3()
的速度更快。但是对于较小的data
来说情况并非如此。问题是-为什么?是NumPy、Python还是其他原因?
np.random.randint
调用之前设置随机种子。 - smci