在Python / Numpy中优化许多矩阵操作
在编写一些数字分析代码时,我对一个需要许多Numpy调用的函数进行了分析。 我不完全确定如何进一步的性能优化。
问题:
该功能通过计算以下内容来确定错误,
码:
def foo(B_Mat, A_Mat):
Temp = np.absolute(B_Mat)
Temp /= np.amax(Temp)
return np.sqrt(np.sum(np.absolute(A_Mat - Temp*Temp))) / B_Mat.shape[0]
从代码中挤出一些额外性能的最佳方法是什么? 我的最佳行动方案是用Cython在单个for循环中执行大部分操作以减少临时阵列吗?
从实现中可以卸载到已知对于算术计算非常有效的numexpr
模块。 对于我们的情况,具体而言,我们可以使用它进行平方,求和和绝对计算。 因此,一个基于numexpr
的解决方案将取代原始代码中的最后一步,
import numexpr as ne
out = np.sqrt(ne.evaluate('sum(abs(A_Mat - Temp**2))'))/B_Mat.shape[0]
通过将标准化步骤嵌入到numexpr
的求值表达式中numexpr
进一步的性能提升。 因此,修改为使用numexpr
的整个函数应该是 -
def numexpr_app1(B_Mat, A_Mat):
Temp = np.absolute(B_Mat)
M = np.amax(Temp)
return np.sqrt(ne.evaluate('sum(abs(A_Mat*M**2-Temp**2))'))/(M*B_Mat.shape[0])
运行时测试 -
In [198]: # Random arrays
...: A_Mat = np.random.randn(4000,5000)
...: B_Mat = np.random.randn(4000,5000)
...:
In [199]: np.allclose(foo(B_Mat, A_Mat),numexpr_app1(B_Mat, A_Mat))
Out[199]: True
In [200]: %timeit foo(B_Mat, A_Mat)
1 loops, best of 3: 891 ms per loop
In [201]: %timeit numexpr_app1(B_Mat, A_Mat)
1 loops, best of 3: 400 ms per loop
链接地址: http://www.djcxy.com/p/62929.html
上一篇: Optimizing Many Matrix Operations in Python / Numpy
下一篇: Iterating over arrays in cython, is list faster than np.array?