Python 优化numpy矩阵运算(当前使用for循环)
我已经编写了一些代码,根据列表中的n项计算n个矩阵,然后在最后将所有矩阵相乘 代码相对较慢,我想了解更多关于python优化的信息。我已经使用了分析工具,发现我的程序中的慢是这个矩阵乘法循环 我想知道是否有人对我如何加快速度有什么建议,也许是利用Python/NumPy中内置的基于C的函数Python 优化numpy矩阵运算(当前使用for循环),python,optimization,numpy,matrix,matrix-multiplication,Python,Optimization,Numpy,Matrix,Matrix Multiplication,我已经编写了一些代码,根据列表中的n项计算n个矩阵,然后在最后将所有矩阵相乘 代码相对较慢,我想了解更多关于python优化的信息。我已经使用了分析工具,发现我的程序中的慢是这个矩阵乘法循环 我想知道是否有人对我如何加快速度有什么建议,也许是利用Python/NumPy中内置的基于C的函数 def my_matrix(x): # Initialise overall matrix as an identity matrix # | M_11 M_12 | # | M_2
def my_matrix(x):
# Initialise overall matrix as an identity matrix
# | M_11 M_12 |
# | M_21 M_22 |
M = np.matrix([[1, 0],[0, 1]])
for z in z_all:
param1 = func1(z)
param2 = func2(x, z)
param3 = func3(x, z)
M_11 = param1 + param2
M_12 = param1 - param2
M_21 = param1 * param2
M_22 = param1 / param2
# Multiply matrix with overall master matrix
M = M * np.matrix([[M_11, M_12],[M_21, M_22]])
return M
从一些背景资料来看,函数调用的计算成本似乎很高,因此,为我的参数计算数组,然后访问数组可能比每次在循环中计算函数更有效。。。e、 g
param1s = funcs(z_all)
param2s = funcs(x, z_all)
etc
然后在for循环中:
for i, z in enumerate(z_all):
param1 = params1[i]
param2 = params2[i]
etc.
这会更快,但只有大约10%,因为在循环中使用param1=params1[i]进行数组访问所花费的时间抵消了更少函数调用所节省的时间
有人有什么建议吗?您可以将M_11的计算矢量化。。。M_22通过执行
M_11s=params1+params2
等操作
这样,您只需在循环中执行矩阵乘法:
import numpy as np
...
# compute your 'params' over vectors of z-values
param1s = func1(z_all)
param2s = func2(x, z_all)
param3s = func3(x, z_all) # you don't seem to be using this for anything...
# compute 'M_11, ... M_22'
M_11 = param1s + param2s
M_12 = param1s - param2s
M_21 = param1s * param2s
M_22 = param1s / param2s
# we construct a (2, 2, nz) array from these
M_all = np.array([[M_11, M_12], [M_21, M_22]])
# roll the 'nz' axis to the front so that its shape is (nz, 2, 2)
M_all = np.rollaxis(M_all, -1, 0)
# initialize output with the identity
M_out = np.eye(2)
# loop over each (2, 2) subarray in 'M_all', update the output with the
# corresponding dot product
for mm in M_all:
M_out = M_out.dot(mm)
在整个循环中是否有任何参数/变量保持不变?如果是这样的话,你可以在循环之前定义它,这样你就不用一遍又一遍地运行函数了。谢谢,这会使速度提高3倍!你能详细解释一下为什么这样更快吗?一般来说,使用数组比使用矩阵更好,因为这里的numpy点积似乎等同于矩阵乘法。提高速度的主要原因是
M_11,M_22
现在已矢量化。对整个向量进行操作总是优于对单个元素进行索引。这里使用数组而不是矩阵的主要理由是数组可以具有任意秩,而矩阵的最大秩为2。如果我使用矩阵,mul
必须是(2,2)
矩阵的列表,而不是一个数组。选择数组而不是矩阵还有很多其他原因。谢谢,这是一个非常有用的回答。我实际上想计算二维参数空间的M_。现在我循环一个参数(我们称之为“时间”),对于times数组中的每一次,我都使用上面的代码来计算M_out。我想知道是否可以通过使用一些向量操作替换for循环来进一步改进这一点。我已经详细阐述并概括了我的问题,因为我认为这里过多的讨论可能会冲淡这个问题和回答: