Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我的矩阵M就是16384 x 81 。我想计算M * Mt (结果将为16384x16384 )。
我的问题是: 有人可以解释一下运行时间的差异吗? 在C ++中使用OpenCV,以下代码耗时18秒 #include #include using namespace cv; int main(void) { Mat m(16384, 81, CV_32FC1); randu(m, Scalar(0), Scalar(1)); int64 tic = getTickCount(); Mat m2 = m * mt(); printf("%f", (getTickCount() - tic) / getTickFrequency()); } 在Python中 ,以下代码仅需0.9秒 18.8秒 (请参阅下面的评论) import numpy as np from time import time m = np.random.rand(16384, 81) tic = time() result = np.dot(m, mT) print (time() - tic) 在MATLAB中 ,以下代码耗时17.7秒 m = rand(16384, 81); tic; result = m * m'; toc; 我唯一的猜测是这是一个内存问题,并且Python能够以某种方式避免交换空间。但是,当我观看top时,我看不到我的C++ application使用了所有内存,并且我曾期望C++会赢得胜利。感谢您的任何见解。 编辑 将示例修改为仅对操作计时的时间之后,现在使用Python的代码也需要18秒。我真的不确定发生了什么,但是如果有足够的内存,它们现在似乎都可以执行相同的操作。 如果行数是8192,请按以下时间进行:C ++:4.5秒Python:4.2秒Matlab:1.8秒 回答: 您在什么CPU上运行?对于具有动态时钟的现代x86和x64芯片,不能信任getTickCount和getTickFrequency 。 18秒足够长,可以根据计时器中断从标准OS功能获得可接受的精度。 您在OpenCV中使用什么BLAS? MatLab安装了一些高度优化的软件,IIRC甚至可以检测您的CPU并适当地加载Intel或AMD的数学库。 更多&回答... |
![]() |
![]() |