如何将Python编译成C语言
作者:Xeon_CC? 发布时间:2022-01-02 10:49:31
标签: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 = 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


猜你喜欢
- 1、有了已经训练好的模型参数,对这个模型的某些层做了改变,如何利用这些训练好的模型参数继续训练:pretrained_params = to
- 当你使用Lumigent log Explorer连接服务器后,选择具体的数据库实例时报错,提示 &nbs
- import random, stringclass C(object): passdef danger
- 一:关于MySQL5 MySQL5系列数据库是MySQL的最新版本的数据库,比较流行的发行版是mysql-5.0.18。MySQL 英文官方
- __author__ = 'Administrator'import numpy as npimport cv2mri_im
- 逢七拍腿游戏几个小朋友在一起玩逢七拍腿的游戏,从1开始数数,当数到7的倍数或者尾号是7时,拍一下腿。现在从1数到99,假设每个人都没有错,计
- 阅读器访问地址:http://easyrss.tk/,欢迎体验!阅读导览一、 概述 二、 设计的基本概念和原理 三、 设计方案四、 主要源代
- 在用wordpress这个博客的时候,我很奇怪的发现,最近写的内容排在第一页,而最早写的成了最后页。这显然有悖逻辑,正常的情况应该是最早写的
- 比较两个时间序列在图形上是否相似,可以通过以下方法:1.可视化比较:将两个时间序列绘制在同一张图上,并使用相同的比例和轴标签进行比较。可以观
- 相信大家从去年圣诞节开始,逐渐发现淘宝网首页的标志开始有了新的形式,从过往的静态图片节日LOGO变成了FLASH的动画小故事LO
- 如下所示:$ary = array( array('t'=>1,'y'=>2), &
- 1.什么是守护进程守护进程是脱离于终端并且在后台运行的进程。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会
- root账户为MySQL的超级管理员用户,拥有MySQL提供的所有权限。我们登录了root账户可以重置其它创建的所有用户的密码,那么root
- 下面是模板的一般形式,显示了指定 SQL 查询和 XPath 查询的方式: <ROOT xmlns:sql="ur
- 本文实例讲述了python使用any判断一个对象是否为空的方法。分享给大家供大家参考。具体实现代码如下:>>> eth =
- 在开发过程中我们需要将我们的数据通过图标的形式展现出来,接下来我为大家介绍一个有趣的框架:Echarts。这是一个使用JavaScript实
- 我看见朋友可以把数据库的记录输出到页面表格上去,觉得很有用。这是怎么做的啊?见下:dbtable.asp<html><he
- 我们知道同步执行和异步执行的区别,为了更好的提高用户的体验,我们都会采用异步方式去处理一些问题,毕竟单线程的同步可能回造成卡死等现象,很不友
- 求解三角形第三边长import mathx=input('输入两边长及夹角(度):')#输入时候使用空格分隔3个值a,b,t
- 引言委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就