0


Python编译成C语言,性能有多暴力?

我这里用的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=3import time
import pyximport

pyximport.install()import pyth_triples

defmain():
    start = time.time()
    result = pyth_triples.count_triples(1000)
    duration = time.time()- start
    print(result, duration *1000,"ms")if __name__ =='__main__':
    main()

创建pyth_triples.py

# encoding=utf-8# cython: language_level=3defcount_triples(limit):
    result =0for a inrange(1, limit +1):for b inrange(a +1, limit +1):for c inrange(b +1, limit +1):if c **2> a **2+ b **2:breakif c **2==(a **2+ b **2):
                    result +=1return result

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

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

# encoding=utf-8# cython: language_level=3defcount_triples(limit):
    cdef int result =0
    cdef int a =0
    cdef int b =0
    cdef int c =0for a inrange(1, limit +1):for b inrange(a +1, limit +1):for c inrange(b +1, limit +1):if c **2> a **2+ b **2:breakif c **2==(a **2+ b **2):
                    result +=1return result

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

# encoding=utf-8# cython: language_level=3from distutils.core import setup

from Cython.Build import cythonize

# set PYTHONHOME=D:\Anaconda3# conda activate# python setup.py build_ext --inplace
setup(
    ext_modules=cythonize("pyth_triples.pyx"))

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

set PYTHONHOME=D:\Anaconda3
conda activate
python setup.py build_ext --inplace

这将生成.c文件和一些不知道什么文件。
在这里插入图片描述

执行main.py以后,结果不变,实行时间由原来的57603毫秒减少到35毫秒左右,相差1600多倍。
在这里插入图片描述

如果用Java去跑这套代码
Java代码:

publicclassTriplesTest{publicstaticvoidmain(String[] args){long startTime =System.currentTimeMillis();System.out.println(count_triples(1000));long endTime =System.currentTimeMillis();System.out.println("run time:"+(endTime - startTime)+"ms");}publicstaticintcount_triples(int limit){int result =0;for(int a =1; a <= limit; a++){for(int b = a +1; b <= limit; b++){for(int c = 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;}}}}return result;}}

执行时间是130ms左右。
在这里插入图片描述


本文转载自: https://blog.csdn.net/Xeon_CC/article/details/122582936
版权归原作者 Xeon_CC 所有, 如有侵权,请联系我们删除。

“Python编译成C语言,性能有多暴力?”的评论:

还没有评论