如何加速这个python代码(条件循环)?

时间:2014-01-12 01:16:10

标签: python performance loops numpy

我试图找到一种方法,在循环中不使用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)

2 个答案:

答案 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()