当前位置: 首页 > 科技观察

Python可以比C++更快,你不相信吗?

时间:2023-03-16 10:51:01 科技观察

Python是一门非常通用的编程语言,拥有数以千计的第三方库,在人工智能、机器学习、自动化等方面有着广泛的应用。众所周知,Python是一门具有全球性的动态语言interpreterlock,比其他静态语言慢,为此,你可能会转向其他语言,如Java,C++,但是等等,今天我将分享一个可以让Python比C++更快的技术,然后决定是否使用它或不转动它。今天的主角是Numba。Numba是一个开源的JIT编译器,可以将Python和NumPy代码转换成快速的机器代码,从而提高运行速度。可以达到C或FORTRAN的速度。有那么难用吗?不不不,Soeasy,不需要更换Python解释器,不需要单独编译,甚至不需要安装C/C++编译器。只需将Numba提供的装饰器放在Python函数之上,Numba就会完成剩下的工作。一个简单的例子:fromnumbaimportjitimportrandom@jit(nopython=True)defmonte_carlo_pi(nsamples):acc=0foriinrange(nsamples):x=random.random()y=random.random()if(x**2+y**2)<1.0:acc+=1return4.0*acc/nsamplesNumba是为科学计算而设计的。与NumPy一起使用时,Numba会为不同的数组数据类型生成专用代码以优化性能:@numba。jit(nopython=True,parallel=True)deflogistic_regression(Y,X,w,迭代):foriinrange(迭代):w-=np.dot(((1.0/(1.0+np.exp(-Y*np.dot(X,w)))-1.0)*Y),X)returnw下面我们来看看同样的代码使用Numba和C++前后的性能对比。比如我们要找出1000万以内的所有素数,代码的算法逻辑是一样的:Python代码:importmathimporttimedefis_prime(num):ifnum==2:returnTrueifnum<=1ornotnum%2:returnFalsefordivinrange(3,int(math.sqrt(num)+1),2):ifnotnum%div:returnFalsereturnTruedefrun_program(N):total=0foriinrange(N):ifis_prime(i):total+=1returntotalif__name__=="__main__":N=10000000start=time。time()total=run_program(N)end=time.time()print(f"totalprimenumis{total}")print(f"cost{end-start}s")执行耗时:totalprimenumis664579cost47.386465072631836sC++代码如下如下:#include#include#includeusingnamespacestd;boolisPrime(intnum){if(num==2)returntrue;if(num<=1||num%2==0)returnfalse;doublesqrtsqrt_num=sqrt(double(num));for(intdiv=3;div<=sqrt_num;div+=2){if(num%div==0)returnfalse;}returntrue;}intrun_program(intN){inttotal=0;for(inti;i