python - 在 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]]
),但是,计算我将要使用它的目的需要很长时间。任何有关如何使这更快的帮助将不胜感激。谢谢
解决方案
你可以用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
推荐阅读
- php - 在函数中定义值的最聪明的方法是什么?
- javascript - 如何使用 ramda 按数组对象中的最后一项排序
- node.js - 如何在 mongodb/mongoose 中分离用户对数据库的访问
- php - 如何修复json中的意外字符错误
- java - 在同一个项目中使用多个版本划分相同的依赖项名称
- java - 在 List 中流式传输不同的 Array 元素
- git - 单个 dotnet 核心解决方案 + git repo 中的多个微服务?
- java - 与 Memoize 一起使用的番石榴供应商的 Sonarlint 违规行为
- django - 外键转换为字符域
- ruby - 在 Ruby 中禁用 OptionParser 标志的自动完成