如何在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
值得改进。
提议的副本是 。那还是有好主意的。
假设我有以下 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
值得改进。
提议的副本是