如何將Python編譯成C語(yǔ)言
前言:
文章里用的Python環(huán)境是Anaconda3 2019.7
這里測(cè)試的程序是找出所有1000以內(nèi)的勾股數(shù)。
a∈[1, 1000],b∈[1, 1000], c∈[1, 1000]
足a² + b² = c²
有多少種解?
如果用普通的python去寫,代碼如下:
創(chuàng)建一個(gè)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()
創(chuàng)建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
這時(shí)候還沒有編譯成C去運(yùn)行,只是從pyx文件導(dǎo)入函數(shù)去使用。
執(zhí)行結(jié)束以后,結(jié)果為881,耗時(shí)為57603毫秒,太慢了。
現(xiàn)在開始,我們編譯成C語(yǔ)言去運(yùn)行,看一下效果。
修改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
創(chuàng)建setup.py (這一步其實(shí)可以不做,因?yàn)檫@只是把編譯結(jié)果寫入本地磁盤,給我們展示生成的C語(yǔ)言代碼長(zhǎng)什么樣)
# 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的終端執(zhí)行以下命令:
set PYTHONHOME=D:\Anaconda3 conda activate python setup.py build_ext --inplace
這將生成.c文件和一些不知道什么文件
執(zhí)行main.py
以后,結(jié)果不變,實(shí)行時(shí)間由原來的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; ? ? } }
執(zhí)行時(shí)間是130ms左右。
到此這篇關(guān)于如何將Python編譯成C語(yǔ)言的文章就介紹到這了,更多相關(guān)將Python編譯成C語(yǔ)言內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解K-means算法在Python中的實(shí)現(xiàn)
這篇文章主要介紹了詳解K-means算法在Python中的實(shí)現(xiàn),具有一定借鑒價(jià)值,需要的朋友可以了解下。2017-12-12python實(shí)現(xiàn)鍵盤控制鼠標(biāo)移動(dòng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)鍵盤控制鼠標(biāo)移動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10Python?matplotlib設(shè)置多子圖、子圖間距及外邊距的幾種方式
子圖是Matplotlib中強(qiáng)大的功能之一,使用函數(shù)您可以方便地創(chuàng)建多個(gè)子圖,并使用Axes對(duì)象繪制各種圖形,下面這篇文章主要給大家介紹了關(guān)于Python?matplotlib設(shè)置多子圖、子圖間距及外邊距的幾種方式,需要的朋友可以參考下2024-02-02Python多進(jìn)程入門、分布式進(jìn)程數(shù)據(jù)共享實(shí)例詳解
這篇文章主要介紹了Python多進(jìn)程入門、分布式進(jìn)程數(shù)據(jù)共享,結(jié)合實(shí)例形式詳細(xì)分析了Python進(jìn)程操作技巧數(shù)據(jù)共享相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2019-06-06使用OpenCV對(duì)車道進(jìn)行實(shí)時(shí)檢測(cè)的實(shí)現(xiàn)示例代碼
這篇文章主要介紹了使用OpenCV對(duì)車道進(jìn)行實(shí)時(shí)檢測(cè)的實(shí)現(xiàn)示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06