我这里用的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=3 import time import pyximport
pyximport.install() import pyth_triples def main(): 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=3 def count_triples(limit): result =
0 for a in range(1, limit + 1): for b in range(a + 1, limit + 1): for c in range
(b + 1, limit + 1): if c ** 2 > a ** 2 + b ** 2: break if c ** 2 == (a ** 2 + b
** 2): result += 1 return result
这时候还没有编译成C去运行,只是从pyx文件导入函数去使用。
执行结束以后,结果为881,耗时为57603毫秒,太慢了。

现在开始,我们编译成C语言去运行,看一下效果。
修改pyth_triples.pyx文件,定义的变量都改为cdef int xxx = 0
# encoding=utf-8 # cython: language_level=3 def count_triples(limit): cdef int
result= 0 cdef int a = 0 cdef int b = 0 cdef int c = 0 for a in range(1, limit +
1): for b in range(a + 1, limit + 1): for c in range(b + 1, limit + 1): if c **
2 > a ** 2 + b ** 2: break if c ** 2 == (a ** 2 + b ** 2): result += 1 return
result
创建setup.py (这一步其实可以不做,因为这只是把编译结果写入本地磁盘,给我们展示生成的C语言代码长什么样)
# encoding=utf-8 # cython: language_level=3 from 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代码:
public class TriplesTest { public static void main(String[] args) { long
startTime= System.currentTimeMillis(); System.out.println(count_triples(1000));
long endTime = System.currentTimeMillis(); System.out.println("run time:" + (
endTime- startTime) + "ms"); } public static int count_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左右。

技术
©2019-2020 Toolsou All rights reserved,
C语言——qsort函数CSS实现溢出显示省略号网络层协议——ICMP协议C语言小游戏-俄罗斯方块Qt入门教程【基础控件篇】QCalendarWidget日历控件用python来控制wifi连接vue中input框只能输入数字Python内置函数C语言数据结构-顺序表删除重复V2.0.0abaqus质量缩放系数取值_ABAQUS的质量缩放