文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何将Python编译成C语言

2024-04-02 19:55

关注

前言:

文章里用的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左右。

到此这篇关于如何将Python编译成C语言的文章就介绍到这了,更多相关将Python编译成C语言内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯