gpt4 book ai didi

python - 在 Python/Numpy 中优化许多矩阵运算

转载 作者:行者123 更新时间:2023-11-30 22:53:07 25 4
gpt4 key购买 nike

在编写一些数值分析代码时,我遇到了需要多次 Numpy 调用的函数的瓶颈。我不完全确定如何进一步优化性能。

问题:

该函数通过计算以下内容来确定误差,

Error function

代码:

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 module众所周知,这对于算术计算非常有效。对于我们的例子,具体来说,我们可以用它执行平方、求和和绝对计算。因此,基于 numexpr 的解决方案来替换原始代码中的最后一步,就像这样 -

import numexpr as ne

out = np.sqrt(ne.evaluate('sum(abs(A_Mat - Temp**2))'))/B_Mat.shape[0]

通过将标准化步骤嵌入到 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

关于python - 在 Python/Numpy 中优化许多矩阵运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38311794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com