我有两个函数np_prod
和slice_prod
,它们对形状相同的两个NumPy数组mat1
和mat2
执行相同的逐元素操作.然而,我注意到np_prod
函数比slice_prod
函数慢.我使用以下代码来测量性能:
import numpy as np
import timeit
shape = (10, 600, 600)
mat1 = np.random.rand(*shape).astype(np.float32)
mat2 = np.random.rand(*shape).astype(np.float32)
def np_prod(mat1, mat2):
res = mat1.copy()
res *= -1
res += 1
res *= (1 - mat2)
res *= -1
res += 1
return res
def slice_prod(mat1, mat2):
res = mat1.copy()
for i in range(res.shape[0]):
res[i] *= -1
res[i] += 1
res[i] *= (1 - mat2[i])
res[i] *= -1
res[i] += 1
return res
N = 400
print("For loop product: ", timeit.timeit("slice_prod(mat1, mat2)", setup="from __main__ import slice_prod, mat1, mat2", number=N))
print("Numpy product: ", timeit.timeit("np_prod(mat1, mat2)", setup="from __main__ import np_prod, mat1, mat2", number=N))
得到的结果是
For loop product: 15.605191999999999
Numpy product: 18.899588700000002
我的NumPy版本是1.24.2.我预计NumPy实现会更快,因为它优化了数组操作,但在这种情况下,for-loop版本似乎更快.有谁能解释为什么会发生这种情况,以及我如何优化np_prod
以使速度更快?
(我提供的示例是我的用例的简化版本.在我自己的代码中,性能差异更显著,比如2倍,使用time.perf_count测量)