python為什么要調(diào)用c ?
python不擅長(zhǎng)"大量運(yùn)算"任務(wù);
python程序優(yōu)勢(shì)在于:編寫(xiě)簡(jiǎn)單,適合"IO密集型作業(yè)"(比如打開(kāi)文件,下載圖片,運(yùn)行腳本).python作為知名的"膠水語(yǔ)言",快速實(shí)現(xiàn)"計(jì)算密集型作業(yè)"的方法就是"把c的代碼拿過(guò)來(lái)直接用"!
python調(diào)用c語(yǔ)言代碼的方式十分簡(jiǎn)單,只需四步:
1.將.c
后綴的文件編譯為動(dòng)態(tài)庫(kù)文件(.so
結(jié)尾)
格式
- gcc 原文件名.c -shared -o 新文件名.so
示例
- 以將
c_dll.c
編譯為c_dll.so
為例
gcc c_dll.c -shared -o c_dll.so
2.在python文件中導(dǎo)入頭文件
示例
from ctypes import *
3.在python中引入c動(dòng)態(tài)庫(kù),并用變量接收動(dòng)態(tài)庫(kù)的引用
格式
- 變量名 = cdll.LoadLibrary("動(dòng)態(tài)庫(kù)文件路徑")
示例
result = cdll.LodaLibrary("./c_dll.so")
4.調(diào)用動(dòng)態(tài)庫(kù)方法
格式
- 動(dòng)態(tài)庫(kù)引用.庫(kù)函數(shù)(參數(shù))
示例
result.my_add(num)
附源碼:
c_add.py
import time
from ctypes import *
def main():
num = int(input("請(qǐng)輸入整數(shù)值:"))
result = 0
start_time = time.time()
result = cdll.LoadLibrary("./c_dll.so")
result.my_add(num)
end_time = time.time()
print("總共用時(shí)%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累加的計(jì)算結(jié)果為%ld\n",num,result);
}
python_add.py
import time
def main():
num = int(input("請(qǐng)輸入整數(shù)值:"))
result = 0
start_time = time.time()
for i in range(num+1):
result += i
print("從1到%d累加的計(jì)算結(jié)果為%d"%(num,result))
end_time = time.time()
print("總共用時(shí)%s"%(end_time-start_time))
if __name__ == "__main__":
main()