1. 程式人生 > >PYTHON呼叫C介面(基於Ctypes)實現stein演算法最大公約數的計算

PYTHON呼叫C介面(基於Ctypes)實現stein演算法最大公約數的計算

相關環境配置

  • 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) return
b; 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 int
a,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直接呼叫的庫,懶先不寫了