如何在numpy中优化指数迭代

how to optimize iteration on exponential in numpy

假设我有以下 numpy array

n = 50
a = np.array(range(1, 1000)) / 1000.

我要执行这行代码

%timeit v = [a ** k for k in range(0, n)]
1000 loops, best of 3: 2.01 ms per loop

但是,这行代码最终会循环执行,因此我遇到了性能问题。

有没有办法优化循环?比如list comprehension中的一个具体的计算结果i就是简单的把前面的计算结果在循环中再次乘以a

我不介意将结果存储在二维数组中而不是列表中的数组中。那可能会更干净。顺便说一下,我也尝试了以下方法,但它产生了类似的性能结果:

    k = np.array(range(0, n))
    ones = np.ones(n)
    temp = np.outer(a, ones)

然后进行如下计算

%timeit temp ** k
1000 loops, best of 3: 1.96 ms per loop

%timeit np.power(temp, k)
1000 loops, best of 3: 1.92 ms per loop

但是两者都会产生与上面的列表理解相似的结果。顺便说一下,n 在我的例子中永远是 integer

在快速测试中 cumprod 似乎更快。

In [225]: timeit v = np.array([a ** k for k in range(0, n)])
2.76 ms ± 1.62 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [228]: %%timeit 
     ...: A=np.broadcast_to(a[:,None],(len(a),50))
     ...: v1=np.cumprod(A,axis=1)
     ...: 
208 µs ± 42.3 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)

为了比较值,我必须调整范围,因为 v 包含 0 次幂,而 v1 以 1 次幂开始:

In [224]: np.allclose(np.array(v)[1:], v1.T[:-1])
Out[224]: True

但时间表明 cumprod 值得改进。

提议的副本是 。那还是有好主意的。