我试图找到一种方法,在循环中不使用if ... else条件,这样可以加速代码,任何想法?
for i in range(n):
for j in range(n):
if a1[i, j] == 0:
b1[i, j] = 1
else:
b1[i, j] = a1 / np.sin(a1)
if a2[i, j] == 0:
b2[i, j] = 1
else:
b2[i, j] = a2 / np.sin(a2)
答案 0 :(得分:8)
您正在计算sinc函数的倒数。所以你可以这样做:
b1 = 1.0 / np.sinc(a1/np.pi)
b2 = 1.0 / np.sinc(a2/np.pi)
numpy sinc函数是矢量化的,所以你不需要编写循环。
答案 1 :(得分:1)
if()
语句被认为是O(1)
时间操作,但如果效率至关重要,那么错过的分支预测可能代价高昂(在这种情况下,在Python代码中运行for循环不是最好的)选择)。
除了可能遗漏的分支预测之外,正如@Keeler所提到的,渐近时间是O(n^2)
。优化for循环中的代码可能有助于在Big-Oh表示法中使用一些常量因素,这在实践中证明是非常有成效的。
您可以做的优化是遵循@Warren的建议并使用sinc()