如何将Python编译成C语言
作者:Xeon_CC? 时间:2022-01-02 10:49:31
前言:
文章里用的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左右。
来源:https://blog.csdn.net/Xeon_CC/article/details/122582936
标签:Python,C语言
0
投稿
猜你喜欢
Mysql自增主键id不是以此逐级递增的处理
2024-01-19 03:07:55
详解JS如何判断对象上是否存在某个属性
2024-04-16 09:49:28
PHP登录(ajax提交数据和后台校验)实例分享
2024-04-28 09:43:41
Python 图像对比度增强的几种方法(小结)
2022-04-14 18:16:39
Python学习之流程控制与条件判断总结
2023-08-20 13:37:02
python自动化测试selenium定位frame及iframe示例
2023-01-08 16:25:28
Python中集合类型(set)学习小结
2023-03-18 13:56:27
用Python遍历C盘dll文件的方法
2023-04-27 20:15:27
Golang收支记账程序详细编写过程
2024-04-25 15:17:38
ASP实例:读取xml文件的程序
2007-11-04 18:47:00
小白入门篇使用Python搭建点击率预估模型
2021-02-09 20:49:04
AJAX在GET中文的时候解决乱码的方法
2007-11-04 13:04:00
前端html+css实现动态生日快乐代码
2024-05-10 10:58:12
Python画图工具Matplotlib库常用命令简述
2021-10-11 07:28:07
学生信息管理系统python版
2023-10-17 07:32:34
解决python中使用PYQT时中文乱码问题
2023-07-28 10:15:51
在Python中处理字符串之isdecimal()方法的使用
2021-03-18 04:25:18
Pytorch中的model.train() 和 model.eval() 原理与用法解析
2022-06-06 20:51:04
SQL Server中两种修改对象所有者的方法
2009-01-15 13:10:00
Python数学建模PuLP库线性规划入门示例详解
2023-06-13 13:06:20