如果不调用第三方库,C++比Python快很多是不争的事实,下面的这些博文都以实际例子证明了C++比Python快很多的事实。
python和C++的性能分析(寻找素数)
python运行速度和c_Python与C++之间运行速度对比
与Python的速度较量:C++究竟有多快?
Python和C语言运行速度对比(累加1亿次)
但是调用第三方库的情况可能就有所不同。
博主曾听说,我们在Python中使用的OpenCV,实际上是用C++写好的OpenCV代码进行编译得到的,本质上只是用Python调用C++程序,Python只是个壳。
如果是这样的话,那么在C++中调用OpenCV的函数应该和Python中调用OpenCV的函数耗时差不多。
那么是不是这样呢?
网上查阅了相关情况,发现还真是这样 ,比如下面这个链接中作的实验:
https://wenku.baidu.com/view/8e488521eb7101f69e3143323968011ca300f762.html
博主也做了个实验,实验结果居然是Python比OpenCV快。
实验是对同样一幅图像,调用200次Canny边缘检测函数,看时间的消耗。
代码中用到的图像下载链接:
https://pan.baidu.com/s/1uxc_My59b7f9C7iJLBS3hQ?pwd=z0xn
Python代码如下:
import cv2 as cv
import sys
import datetime
image = cv.imread('F:/material/images/2022/2022-06/01_woman_samll.jpg', 0)
if image is None:
print('Error: Could not load image')
sys.exit()
begin1 = datetime.datetime.now()
for i in range(200):
Canny_low = cv.Canny(image, 50, 100, apertureSize=3)
end1 = datetime.datetime.now()
# 以毫秒为单位
print('Canny(opencv-python) time consuming:{}ms'.format(1000*((end1 - begin1).total_seconds())))
C++代码如下:
#include
#include
using namespace cv;
int main()
{
Mat image = imread("F:/material/images/2022/2022-06/01_woman_samll.jpg",0);
if (image.empty())
{
std::cout << "Error: Could not load image" << std::endl;
return 0;
}
//imshow("Source Image", image);
Mat Canny_low;
double begin1, end1, time1;
begin1 = (double)getTickCount();
const int ntimes = 200;
for (int i = 0; i < ntimes; i++)
{
Canny(image, Canny_low, 50, 100, 3);
}
end1 = (double)getTickCount();
time1 = 1000*(end1 - begin1) / getTickFrequency();
std::cout << "Canny(opencv-C++) time consuming:" << time1 << "ms" << std::endl<<std::endl;
return(0);
}
两段代码的运行结分别如下:
这差的不是一点啊,Python用时77.77毫秒,C++用时229.84毫秒,C++用时是Python用时的229.87/77.77=3倍。
我们测一下都运行一次的时间呢,把循环次数改为1,两个的运行时间分别如下:
Python用时0.974毫秒,C++用时88.54毫秒,,C++用时是Python用时的88.54/0.974=90倍,这差距更大了。
什么原因造成这种情况呢?
一是因为博主的Python-OpenCV版本为OpenCV4.x,而C++中的OpenCV版本为OpenCV3.x,估计是OpenCV4.0的代码效率更高。
二是二者本质上调用的都是OpenCV官方发布的库,所以在效率基础上是没有区别的,相当于核心部分都是C++的效率。
虽然结果是这样,但是一个基础的事实还是得承认,即同样的运算逻辑,C++的效率肯定是比Python的高的。
启示:
如果要想提高自己用Python写成的图像处理代码的速度,请尽量用OpenCV的函数实现,尽量少用Python本身的运算做运算。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)