PYTHON呼叫C介面(基於Ctypes)實現stein演算法最大公約數的計算
阿新 • • 發佈:2018-12-29
相關環境配置
- mingw,選擇相應的32位、64位的版本,主要用於編譯動態連結庫dll檔案,可用vs替代,這裡我選擇輕量級的mingw
- windows64位地址:https://sourceforge.net/projects/mingw-w64/
- 安裝過程中 Architecture選項選擇X86_64,其他預設即可,把安裝好的mingw的bin目錄加入環境配置的PATH列表
一、編寫C函式
/*最大公約數演算法*/ int gcd(unsigned int a,unsigned int b){ unsigned int k=1; if (a==0) returnb; else if (b==0) return a; while((!(a&1))&&(!(b&1))){ k<<=1; a>>=1; b>>=1; } while(!(a&1))a>>=1; while(!(b&1))b>>=1; if(a<b) a^=b,b^=a,a^=b; while(a!=b){ a-=b; if(a<b) a^=b,b^=a,a^=b; } return k*a; }
二、編譯動態連結庫
為了編譯成動態連結庫,在入相應匯出動態連結庫的程式碼,完成後儲存為.c的c檔案,本例儲存為 stein_gcd.c
/*最大公約數演算法*/ #ifdef _MSC_VER #define DLL_EXPORT __declspec( dllexport ) #else #define DLL_EXPORT #endif DLL_EXPORT unsigned int gcd(unsigned inta,unsigned int b){ /*...省略上述c程式碼塊*/ }
在c檔案目錄開啟powshell,執行命令
gcc -m64 -fPIC -shared -msse4 stein_gcd.c -o stein_gcd.dll
完成後會得到動態連結庫 stein_gcd.dll
三、PYTHON呼叫動態連結庫
用Ctypes呼叫dll
from ctypes import * steingcd = cdll.LoadLibrary('stein_gcd.dll')#dll引數是dll的路徑 print(steingcd.gcd(39,26))
簡單的demo就完成了。更多細緻的比如Ctypes的各型別連線python和c時對應的資料型別,則去細緻的翻看ctypes文件,當然也還有更多的方法,比如直接編譯成python直接呼叫的庫,懶先不寫了