〈詳解〉Python3呼叫C程式

木子昭發表於2017-08-20
膠水語言

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
",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()


相關文章