python結合c Python加C,豈不美哉

2021-10-11 20:30:23 字數 2345 閱讀 6482

引言

注意以下內容均為本人主觀操作感受,執行環境為win10+python3.7-32位,僅供本人日後查閱

眾所周知,python是一門優美而簡潔的程式語言,其最大的不足在於執行速度過於感人,而c語言作為最接近底層的高階語言,速度快是他最大的優勢。python被譽為膠水語言,應該有辦法和c語言膠和起來,我查閱資料發現python呼叫c語言最普遍的方式大概有三種:

1、將c語言的函式編譯成dll動態鏈結庫,然後通過python的ctypes模組對dll進行呼叫。

2、藉由cython先將python**編譯成c語言**,然後再講c**編譯成.pyd檔案直接在python中匯入進行呼叫,cython本身有一定語法,不過不會一般也不太影響使用。

3、使用swig可以將c**直接封裝成python**,過程略為複雜,優點是可以為多種語言提供介面。

本文用斐波拉契函式為例,**python和c的合璧之法。

純python:計算結果:102334155

python time cost: 87.49325394630432

純c語言:計算結果:102334155

c cost time:0.863000

差不多差了兩個數量級吧。。。

1、通過ctypes呼叫dll

首先得先生成乙個dll,你可以在ide裡新建乙個dll工程進行建立。更簡單的做法是利用下面的gcc命令直接在cmd裡進行編譯,但前提是你已經裝了mingw或者並mingw-w64且設定了環境變數,其中有個比較坑的地方就是你編譯出來的dll位數要和你的python位數要匹配,像我筆記本上裝的是mingw-w64,而pyhton是32位的,32的python無法呼叫64位的dll,而這位mingw-w64雖說同時支援64位和32位,但是前提是安裝時勾選的是sjlj而不是seh,seh不支援32位!

安裝mingw建議用下面這位up的工具,簡單快捷。

安裝mingw-w64可以參考:

用於編譯dll的c語言**只需給出函式就好了:用於dll的c語言**

下面是cmd中將c原檔案編譯成dll的命令:gcc -fpic -shared name.c -o name.dll

如果是sjlj的mingw-w64加上-m32可以編譯出32位dll:gcc -fpic -shared -m32 name.c -o name.dll

然後在python中匯入ctypes模組就可以呼叫dll了:ctype的匯入與使用

python time cost: 0.9999649524688721

因為只有乙個函式,還呼叫的是c語言的,所以速度和純c差不多。

2、cython

先給出官方的乙個教程:

使用cython首先要安裝cython模組:pip install cython

安裝完環境後就可以直接把之前的純python**中的函式部分進行cython轉換,不過需要現將其字尾名改為.pyx,然後需要再建立乙個setup.py檔案,其中寫入**:from distutils.core import setup

from cython.build import cythonize

setup(

ext_modules = cythonize("fibcy.pyx")

然後還是cmd中執行:python setup.py build_ext --inplace

這時應該會生成乙個.pyd檔案,這個檔案本質和前面的dll應該差不多,可以通過import在python中使用:

cython的使用計算結果:102334155

python time cost: 15.108871698379517

可以看到即使是在沒有使用任何cython語法的情況下,cython的加速能力也是令人驚嘆的,執行速度提高了乙個數量級左右!

3、swig

同樣先給出乙個教程參考:

然後要準備的有c語言原始檔,乙個.i檔案,還有乙個setup.py檔案。fib.c原始檔

fib.i檔案

setup.py檔案

最後在命令列執行setup.py:python setup.py build_ext --inplace

最後生成的檔案中應該有乙個python檔案,可以直接進行呼叫,除此之外我發現還有乙個.pyd檔案,果然和前面的方法都差不多呢,匯入執行方法也和之前相同。

執行結果:計算結果:102334155

python time cost: 0.6825790405273438

居然比純c語言還要快!大概是因為去掉了計時模組的緣故,可能python的計時模組比c的要快?結果還是很匪夷所思呢?

總結python呼叫c語言的三種方法中ctypes方法最簡單,將c**直接編譯成dll即可使用,cython可以為現有的python**加速,swig可以直接將c轉換為python,就是有點麻煩,但速度是最快的。

python 魚c 魚C python之列表

一 列表 乙個打了激素的陣列 1.介紹列表 c語言裡面的陣列 是把同一種型別的資料放在乙個集合裡面 但是python沒有型別的概念,所以python 引入了 列表,各種資料都可以放進去,如 整數 浮點數 字串 物件。2.建立列表 3種方式 普通列表 混合列表 空列表 exp number 飛翼 甲魚...

c python函式 在C中嵌入python函式

我正在嘗試使用cython從 python生成c 但似乎存在名稱重整的一些問題.我首先生成將 從python轉換為c 然後使用gcc將 編譯成.so.我想使用cython而不是c python api的原因是因為我稍後會在更複雜的類上使用它,我希望以後成為乙個速度等的庫 我很難找到去的人從pytho...

氣泡排序(C Python)

begin 1 氣泡排序思想 公升序排序 如 a 9,6,8,7,5,3 i 0第一趟排序 3與5比較,3和5交換位置,a 9,6,8,7,3,5 j len 1 3與7比較,3和7交換位置,a 9,6,8,3,7,5 j len 2 3與8比較,3和8交換位置,a 9,6,3,8,7,5 j le...