C++党最鄙视Python的两个原因:1,计算速度太慢;2,动态语言特性。
对于第2个原因,这需要python程序员好好规范自己的编写习惯,加深对语言和系统的理解。其实作为动态语言的python依旧可以作为超大工程的编程语言的。好了,闲话不多扯。本文主要针对原因1进行“补救”,做了一个C++加速python模块的实验,想测试如果python的部分函数被C++改写,会对整个python系统提升多少。
木盏之前在实验室的研究方向之一就是硬件加速,其实硬件加速的思想和用C++加速python的思想一样,只有一个法则:将经常使用且费时的函数拿底层语言写成“算子”(即一个黑箱),高层语言只需往黑箱里传参然后获得结果即可。
实验准备:Python 2.7/3, g++, linux
先写一个C++函数:
#include<iostream>
#include<string>
using namespace std;
extern "C"{
int cm(int n){
int cm=0;
int i;
for(i=1;i<=n;++i){
cm += i;
cm -= i;
}
return(cm);
}
}
编写完以后记得用g++编译一下:
g++ -o cm.so -shared -fPIC cm.cpp
想要被python调用,C++的函数一定要用extern修饰。 上面这个函数cm又+i又-i的,啥也没做,输出结果一定是0。但是,这个函数的时间复杂度是n,算数运算次数为2n。如果同一个函数用python编写,则可以对比两者的速度。
python代码如下:
import ctypes
from time import time
cpp = ctypes.CDLL('./cm.so')
def cm(n):
res = 0
for i in range(n+1):
res += i
res -= i
return res
if __name__ == '__main__':
num = 1000000
s1 = time()
print("cpp result = %d" % cpp.cm(num))
print('cpp time consuming: ', time()-s1)
s2 = time()
print('python result:%d' % cm(num))
print('python time consuming: ', time()-s2)
运行结果:
我们可以发现,被c++加速过的python程序速度提高了十几倍!
扫描二维码关注公众号,回复:
9321499 查看本文章
总结
Python目前使用的领域越来越多,经常会凸显一些计算速度不足的问题,别动不动就升级硬件来缓解速度问题。Python作为一种动态语言,对于传入参数和返回值的数据类型是不明确的,或者说只有拿到参数的那一刻才知道给参数分配多大的空间。这样势必会导致运算速度的降低!所以,对于算术运算比较多的函数,please使用C++来编写。随便举个例子,你是否还在用python逐像素点处理图片?