如何将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=3
import time
import pyximport
pyximport.install()
import pyth_triples
def main():
start = time.time()
result = unt_triples(1000)
duration = time.time() - start
print(result, duration * 1000, "ms")
if __name__ == '__main__':
main()
创建pyth_triples.py
# encoding=utf-8
编程先学c语言还是python# 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
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左右。
到此这篇关于如何将Python编译成C语⾔的⽂章就介绍到这了,更多相关将Python编译成C语⾔内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论