Python 优化numpy矩阵运算(当前使用for循环)

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

我已经编写了一些代码,根据列表中的n项计算n个矩阵,然后在最后将所有矩阵相乘

代码相对较慢,我想了解更多关于python优化的信息。我已经使用了分析工具,发现我的程序中的慢是这个矩阵乘法循环

我想知道是否有人对我如何加快速度有什么建议,也许是利用Python/NumPy中内置的基于C的函数

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循环来进一步改进这一点。我已经详细阐述并概括了我的问题,因为我认为这里过多的讨论可能会冲淡这个问题和回答: