首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么在Python中使用numpy进行矩阵乘法要比使用ctype快?

为什么在Python中使用numpy进行矩阵乘法要比使用ctype快?
EN

Stack Overflow用户
提问于 2012-05-04 03:36:22
回答 5查看 33.4K关注 0票数 58

我试图找出做矩阵乘法的最快方法,并尝试了3种不同的方法:

纯python实现:这里没什么好奇怪的。

使用numpy.dot(a,b)实现Numpy

使用Python语言中的ctypes模块与C进行接口。

这是转换为共享库的C代码:

以及调用它的Python代码:

我敢打赌,使用C语言的版本会更快……我就输了!下面是我的基准测试,它似乎表明我做得不正确,或者numpy的速度非常快:

我想要理解为什么numpy版本比ctypes版本更快,我甚至不是在谈论纯粹的Python实现,因为它是很明显的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-04 05:01:05

我对Numpy不是很熟悉,但它的源码在Github上。部分点积是用https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/arraytypes.c.src,实现的,我假设它被转换成每种数据类型的特定C实现。例如:

这似乎是在计算一维点积,即对向量进行计算。在我浏览Github的几分钟内,我无法找到矩阵的源代码,但它可能会对结果矩阵中的每个元素使用一次对FLOAT_dot的调用。这意味着这个函数中的循环对应于最里面的循环。

它们之间的一个区别是“步幅”-输入中连续元素之间的差异-在调用函数之前显式计算一次。在你的例子中没有步幅,每次输入的偏移量都是计算出来的,例如a[i *n+ k]。我曾期望一个好的编译器能将它优化成类似于Numpy stride的东西,但它可能无法证明步长是一个常数(或者它没有被优化)。

Numpy也可能在调用此函数的高级代码中使用缓存效果做一些聪明的事情。一个常见的技巧是考虑每一行是连续的,还是每一列都是连续的--并尝试首先迭代每个连续的部分。似乎很难做到完美的优化,对于每个点积,一个输入矩阵必须按行遍历,另一个按列遍历(除非它们碰巧以不同的主序存储)。但它至少可以为result元素做到这一点。

Numpy还包含代码,用于从不同的基本实现中选择特定操作的实现,包括“点”。例如,它可以使用BLAS库。从上面的讨论看,似乎使用了CBLAS。这是从Fortran翻译成C的。我认为你的测试中使用的实现应该是在这里找到的: http://www.netlib.org/clapack/cblas/sdot.c.

请注意,此程序是由一台机器编写的,以供另一台机器读取。但您可以在底部看到,它使用一个展开的循环一次处理5个元素:

这个展开因子很可能是在分析了几个之后选择的。但它的一个理论优势是在每个分支点之间进行更多的算术操作,编译器和CPU有更多的选择来优化它们,以获得尽可能多的指令流水线。

票数 28
EN

Stack Overflow用户

发布于 2012-08-20 02:48:42

NumPy使用高度优化、精心调整的BLAS方法进行矩阵乘法(另请参阅: ATLAS)。本例中的特定函数是GEMM (用于通用矩阵乘法)。你可以通过搜索dgemm.f (它在Netlib中)来查找原文。

顺便说一句,优化超越了编译器优化。上面,Philip提到了Coppersmith-Winograd。如果我没记错的话,这是ATLAS中大多数矩阵乘法使用的算法(尽管有评论者指出它可能是Strassen的算法)。

换句话说,您的matmult算法是微不足道的实现。有更快的方法来做同样的事情。

票数 34
EN

Stack Overflow用户

发布于 2012-05-04 06:30:49

用来实现某种功能的语言本身就不能很好地衡量性能。通常,使用更合适的算法是决定性因素。

在您的例子中,您使用的是学校教授的简单的矩阵乘法,它在O(n^3)中。然而,对于某些类型的矩阵,你可以做得更好,例如方阵,备用矩阵等等。

看看Coppersmith-Winograd算法(O(n^2.3737)中的方阵乘法),作为快速矩阵乘法的良好起点。另请参阅“参考”一节,其中列出了一些指向更快方法的指针。

有关惊人性能提升的更真实示例,请尝试编写一个fast strlen(),并将其与glibc实现进行比较。如果你不能击败它,请阅读glibc的strlen()源代码,它有相当不错的评论。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10442365

复制
相关文章
使用numpy对矩阵进行求逆
昨晚算一道线性代数的题目的时候,算了半天,答案错了。验算了一下,觉得错误应该是出在矩阵求逆的地方。但是真的求逆太慢了,(主要是头晕),那怎么办呢?
灯珑LoGin
2022/10/31
8220
Python numpy tensorflow 中的 点乘 和 矩阵乘法
若 w 为 m*1 的矩阵,x 为 m*n 的矩阵,那么通过点乘结果就会得到一个 m*n 的矩阵。
西湖醋鱼
2020/12/30
2.1K0
Python numpy tensorflow 中的 点乘 和 矩阵乘法
使用python中的Numpy进行t检验
虽然像SciPy和PyMC3这样的流行的统计数据库有预定义的函数来计算不同的测试,但是为了了解这个过程的数学原理,必须了解后台的运行。本系列将帮助你了解不同的统计测试,以及如何在python中只使用Numpy执行它们。 t检验是统计学中最常用的程序之一。但是,即使是经常使用t检验的人,也往往不清楚当他们的数据转移到后台使用像Python和R的来操作时会发生什么。 什么是t检验 t检验(Student’s T Test)比较两个平均值(均值),然后告诉你它们彼此是否有差异。并且,t检验还会告诉你这个差异有没有
AiTechYun
2018/03/05
4.8K0
使用python中的Numpy进行t检验
Python矩阵的创建(不使用numpy
此部分是对python List的扩展应用。 在python中定义一个二维数组,
py3study
2020/01/08
3.2K0
PHP 中使用 (int) 进行类型转换时要比 intval 函数快6倍
在 PHP 中,进行类型转换一般可以使用 intval(var) 函数,或者使用强制类型转换函数 (int)var 使用上这两个没有什么区别,唯一比较大的区别是 intval(var) 函数支持第二个参数 base 转化所使用的进制,但是一般使用过程中,这个参数用的很少。
Denis
2023/04/14
1.2K0
详解Python中的算术乘法、数组乘法与矩阵乘法
(2)列表、元组、字符串这几种类型的对象与整数之间的乘法,表示对列表、元组或字符串进行重复,返回新列表、元组、字符串。
Python小屋屋主
2021/05/11
9.6K0
详解Python中的算术乘法、数组乘法与矩阵乘法
Python|详解矩阵乘法
矩阵相信大家都知道,是线性代数中的知识,就是一系列数集。顾名思义,数字组成的矩形,例如:
算法与编程之美
2020/03/25
2.6K0
numpy基础属性方法随机整理(8):矩阵乘法 及 对应元素相乘的矩阵乘法
矩阵乘法: (m,n) x (n,p) --> (m,p) # 矩阵乘法运算前提:矩阵1的列=矩阵2的行 3种用法: np.dot(matrix_a, matrix_b) == matrix_a @ matrix_b == matrix_a * matrix_b
狼啸风云
2020/12/29
1.9K0
python中数据基本操作、向量乘法、矩阵乘法、广播详解
强烈建议读者朋友在自己的电脑上测试上述代码,以便加强理解。其中广播的仅用到了 + 运算符,而这些广播规则对于任意二进制通用函数都是适用的,大家可以再试试乘法、除法之类的操作。它适用的场景非常多,尤其是在矩阵运算时候,非常方便,体现了巨大优势。
自学气象人
2023/06/20
2500
python中数据基本操作、向量乘法、矩阵乘法、广播详解
numpy中的乘法(*,dot)
numpy中数据表示有数组和矩阵两种数据类型,他们的乘法计算也是多种形式,下面我们主要来说一下numpy中的乘法计算 numpy.ndarray 运算符 *用于计算数量积(点乘),函数 dot()用于计算矢量积(叉乘) 数量积就是点积,也就是对应位置相乘,矢量积就是我们通常所说的矩阵乘法,下面是例子 import numpy as np a = np.arange(1,5).reshape(2,2)#[[1, 2], [3, 4]] b = np.arange(5,9).reshape(2,2)#
听城
2018/04/27
1.1K0
[python3 OpenCV3使用技巧]使用numpy矩阵实现RGB转HSI
看到网上有很多博客都是通过循环遍历的方式来进行RGB转HSI操作,但是我们知道在python中使用Numpy数组并行操作可以更加简洁,速度也更快。
小宋是呢
2019/06/27
1.2K0
[python3 OpenCV3使用技巧]使用numpy矩阵实现RGB转HSI
在Python中如何使用BeautifulSoup进行页面解析
网络数据时代,各种网页数据扑面而来,网页中包含了丰富的信息,从文本到图像,从链接到表格,我们需要一种有效的方式来提取和解析这些数据。然而在处理网页数据时,我们常常面临着需要从页面中提取特定元素或者分析页面结构的问题。这些问题可能包括从网页中提取标题、链接、图片等内容,或者分析页面中的表格数据等。
小白学大数据
2023/09/12
6810
python的numpy向量化语句为什么会比for快?
举例来说,执行 x = 1234+5678 ,对编译型语言,是从内存读入两个short int到寄存器,然后读入加法指令,通知CPU内部的加法器动作,最后把加法器输出存储到x对应的内存单元(实质上,最后这个动作几乎总会被自动优化为“把加法器输出暂存到寄存器而不是内存单元,因为访问内存的时间消耗常常是访问寄存器的几十倍”)。一共2~4条指令(视不同CPU指令集而定)。
我叫什么好
2021/12/25
9610
利用 Numpy 进行矩阵相关运算
NumPy 是Python数据分析必不可少的第三方库,NumPy 的出现一定程度上解决了Python运算性能不佳的问题,同时提供了更加精确的数据类型。如今,NumPy 被Python其它科学计算包作为基础包,已成为 Python 数据分析的基础,可以说 NumPy 就是SciPy、Pandas等数据处理或科学计算库最基本的函数功能库。
fireWang
2019/03/13
2.3K0
利用 Numpy 进行矩阵相关运算
NumPy 是Python数据分析必不可少的第三方库,NumPy 的出现一定程度上解决了Python运算性能不佳的问题,同时提供了更加精确的数据类型。如今,NumPy 被Python其它科学计算包作为基础包,已成为 Python 数据分析的基础,可以说 NumPy 就是SciPy、Pandas等数据处理或科学计算库最基本的函数功能库。
fireWang
2019/04/24
1.3K0
利用 Numpy 进行矩阵相关运算
Python之numpy模块的添加及矩阵乘法的维数问题
在Python中,numpy 模块是需要自己安装的,在安装编程软件时,默认安装了pip,因此我们可以用pip命令来安装
用户7886150
2021/01/27
8080
Python中NumPy简介及使用举例
NumPy是Python语言的一个扩展包。支持多维数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy提供了与Matlab相似的功能与操作方式,因为两者皆为直译语言。
用户7886150
2021/01/07
8130
Python中NumPy简介及使用举例
NumPy是Python语言的一个扩展包。支持多维数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy提供了与Matlab相似的功能与操作方式,因为两者皆为直译语言。
用户7886150
2020/12/23
7780
Python中NumPy简介及使用举例
NumPy是Python语言的一个扩展包。支持多维数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy提供了与Matlab相似的功能与操作方式,因为两者皆为直译语言。
用户7886150
2021/01/02
7210
点击加载更多

相似问题

使用numpy进行矩阵乘法

19

使用Numpy进行矩阵乘法

42

使用numpy进行矩阵乘法

10

如何使用Numpy进行矩阵乘法

115

使用numpy数组进行矩阵乘法

110
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档