Python這些年風頭一直很盛跷究,占據(jù)了很多領(lǐng)域的位置,Web敲霍、大數(shù)據(jù)俊马、人工智能、運維均有它的身影肩杈,甚至圖形界面做的也很順柴我,乃至full-stack這個詞語剛出來的時候,似乎就是為了描述它扩然。
Python雖有GIL的問題導(dǎo)致多線程無法充分利用多核艘儒,但后來的multiprocess可以從多進程的角度來利用多核,甚至affinity可以綁定具體的CPU核与学,這個問題也算得到解決彤悔。雖基本為全棧語言,但有的時候為了效率索守,可能還是會去考慮和C語言混編晕窑。混編是計算機里一個不可回避的話題卵佛,涉及的東西很多杨赤,技術(shù)敞斋、架構(gòu)、團隊情況疾牲、管理植捎、客戶等各個環(huán)節(jié)可能對其都有影響,混編這個問題我想到時候再開一貼專門討論阳柔。本文只講python和C混編的方式焰枢,大致有如下幾種方式(本文背景是linux,其他平臺可以類比):
共享庫
使用C語言編譯產(chǎn)生共享庫舌剂,然后python使用ctype庫里的cdll來打開共享庫济锄。
舉例如下,C語言代碼為
/* func.c */
intfunc(inta)
{returna*a;
}
python代碼為
#!/usr/bin/env python
#test_so.py
from ctypes import cdll
import os
p = os.getcwd() + '/libfunc.so'
f = cdll.LoadLibrary(p)
print f.func(99)
測試如下
$ gcc -fPIC -shared func.c -o libfunc.so
$ ./test_so.py
9801
subprocess
C語言設(shè)計一個完整的可執(zhí)行文件霍转,然后python通過subprocess來執(zhí)行該可執(zhí)行文件荐绝,本質(zhì)上是fork+execve。
舉例如下避消,C語言代碼為
/* test.c */#includeint func(int a)
{
return a*a;
}
int main(int argc, char **argv)
{
int x;
sscanf(argv[1], "%d", &x);
printf("%d\n", func(x));
return 0;
}
Python代碼為
#!/usr/bin/env python#test_subprocess.pyimportosimportsubprocess
subprocess.call([os.getcwd()+'/a.out','99'])
測試如下
$ gcc test.c -o a.out$ ./test_subprocess.py
9801