怎么将Python编译成C语言(c语言,python,开发技术)

时间:2024-05-09 22:54:48 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

前言:

文章里用的Python环境是Anaconda3 2019.7
这里测试的程序是找出所有1000以内的勾股数。
a∈[1, 1000],b∈[1, 1000], c∈[1, 1000]

a² + b² = c² 有多少种解?

如果用普通的python去写,代码如下:

创建一个main.py

#encoding=utf-8#cython:language_level=3importtimeimportpyximportpyximport.install()importpyth_triplesdefmain():start=time.time()result=pyth_triples.count_triples(1000)duration=time.time()-startprint(result,duration*1000,"ms")if__name__=='__main__':main()

创建pyth_triples.py

#encoding=utf-8#cython:language_level=3defcount_triples(limit):result=0forainrange(1,limit+1):forbinrange(a+1,limit+1):forcinrange(b+1,limit+1):ifc**2>a**2+b**2:breakifc**2==(a**2+b**2):result+=1returnresult

这时候还没有编译成C去运行,只是从pyx文件导入函数去使用。
执行结束以后,结果为881,耗时为57603毫秒,太慢了。

怎么将Python编译成C语言

现在开始,我们编译成C语言去运行,看一下效果。
修改pyth_triples.pyx文件,定义的变量都改为cdef int xxx = 0

#encoding=utf-8#cython:language_level=3defcount_triples(limit):cdefintresult=0cdefinta=0cdefintb=0cdefintc=0forainrange(1,limit+1):forbinrange(a+1,limit+1):forcinrange(b+1,limit+1):ifc**2>a**2+b**2:breakifc**2==(a**2+b**2):result+=1returnresult

创建setup.py (这一步其实可以不做,因为这只是把编译结果写入本地磁盘,给我们展示生成的C语言代码长什么样)

#encoding=utf-8#cython:language_level=3fromdistutils.coreimportsetupfromCython.Buildimportcythonize#setPYTHONHOME=D:\Anaconda3#condaactivate#pythonsetup.pybuild_ext--inplacesetup(ext_modules=cythonize("pyth_triples.pyx"))

依次在pycharm的终端执行以下命令:

setPYTHONHOME=D:\Anaconda3condaactivatepythonsetup.pybuild_ext--inplace

这将生成.c文件和一些不知道什么文件

怎么将Python编译成C语言

执行main.py以后,结果不变,实行时间由原来的57603毫秒减少到35毫秒左右,相差1600多倍。

怎么将Python编译成C语言

如果用Java去跑这套代码

Java代码:

publicclassTriplesTest{publicstaticvoidmain(String[]args){longstartTime=System.currentTimeMillis();System.out.println(count_triples(1000));longendTime=System.currentTimeMillis();System.out.println("runtime:"+(endTime-startTime)+"ms");}publicstaticintcount_triples(intlimit){intresult=0;for(inta=1;a<=limit;a++){for(intb=a+1;b<=limit;b++){for(intc=b+1;c<=limit;c++){if(Math.pow(c,2)>Math.pow(a,2)+Math.pow(b,2)){break;}if(Math.pow(c,2)==Math.pow(a,2)+Math.pow(b,2)){result+=1;}}}}returnresult;}}

执行时间是130ms左右。

怎么将Python编译成C语言

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:怎么将Python编译成C语言的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Vue nextTick如何获取更新后的DOM的实现下一篇:

20 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18