首页 > 解决方案 > 在 Python(和 Cython)中计算两个矩阵的点积的最快方法是什么

问题描述

我正在尝试用 Cython 制作一个 Python 库,我需要在其中实现点积。我有一个非常简单的计算点积的方法,但是,对于较大的矩阵,它的运行速度不够快。

我花了很多时间在谷歌上搜索这个问题,并试图让它尽可能快,但是我无法让它更快。

下面的代码显示了我当前如何计算它的 Python 实现:

a = [[1, 2, 3], [4, 5, 6]]
b = [[1], [2], [3]]

def dot(a, b):
    c = [[0 for j in range(len(b[i]))] for i in range(len(a))]

    for i in range(len(c)):
        for j in range(len(c[i])):
            t = 0
            for k in range(len(b)):
                t += a[i][k] * b[k][j]
            c[i][j] = t
    return c

print(dot(a, b))
# [[14], [32]]

这确实给出了正确的计算结果 ( python [[14], [32]]),但是,计算我将要使用它的目的需要很长时间。任何有关如何使这更快的帮助将不胜感激。谢谢

标签: pythoncythonmatrix-multiplication

解决方案


你可以用numpy这个。Numpy 实现了 BLAS 规范(基本线性代数子程序),它们是线性代数库的低级例程(如矩阵乘法)的事实标准。要获得两个矩阵的点积,A可以B使用以下代码:

A = [[1, 2, 3], [4, 5, 6]]
B = [[1], [2], [3]]

import numpy as np #Import numpy

numpy_a = np.array(A) #Cast your nested lists to numpy arrays
numpy_b = np.array(B)
print(np.dot(numpy_a, numpy_b)) #Print the result

推荐阅读