天天看點

〈詳解〉Python3調用C程式

膠水語言

python為什麼要調用c ?

c與python對比

python不擅長"大量運算"任務;

python程式優勢在于:編寫簡單,适合"IO密集型作業"(比如打開檔案,下載下傳圖檔,運作腳本).python作為知名的"膠水語言",快速實作"計算密集型作業"的方法就是"把c的代碼拿過來直接用"!

python調用c語言代碼的方式十分簡單,隻需四步:

1.将

.c

字尾的檔案編譯為動态庫檔案(

.so

結尾)

格式

  • gcc 原檔案名.c -shared -o 新檔案名.so

示例

  • 以将

    c_dll.c

    編譯為

    c_dll.so

    為例

    gcc c_dll.c -shared -o c_dll.so

2.在python檔案中導入頭檔案

  • from ctypes import *

3.在python中引入c動态庫,并用變量接收動态庫的引用

  • 變量名 = cdll.LoadLibrary("動态庫檔案路徑")

  • result = cdll.LodaLibrary("./c_dll.so")

4.調用動态庫方法

  • 動态庫引用.庫函數(參數)

  • result.my_add(num)

附源碼:

c_add.py
import time
from ctypes import *
def main():
    num = int(input("請輸入整數值:"))
    result = 0
    start_time = time.time()
    result = cdll.LoadLibrary("./c_dll.so")
    result.my_add(num)

    end_time = time.time()
    print("總共用時%s"%(end_time-start_time))
    
if __name__ == "__main__":
    main()

           
c_dll.c
#include<stdio.h>

void my_add(int num){

long int result = 0;

for (long int i=1; i<=num; i++){
    result += i;
}
printf("從1到%d累加的計算結果為%ld\n",num,result);
}
           
最終檔案目錄
python_add.py
import time

def main():
    num = int(input("請輸入整數值:"))
    result = 0
    start_time = time.time()

    for i in range(num+1):
        result += i
    print("從1到%d累加的計算結果為%d"%(num,result))
    end_time = time.time()
    print("總共用時%s"%(end_time-start_time))
    
if __name__ == "__main__":
    main()