用Python開發確實為我們減少了很多的約束和開發成本,從而讓我們能夠更加的專注於邏輯而非語法。但是,開發效率雖然提高了,但卻帶來了運行性能的問題。那如何用C語言寫Python的擴展?

萬幸的是,雖然上帝關掉了我們一扇門,但是卻為我們打開了另一扇窗,因為底層是用 C語言 寫的,所以我們可以將一些性能損耗比較大的功能,或者模塊,通過 C語言 重寫,然後 import xxxx 來無縫結合。
哪怕工作中有比較少的機會自己寫C擴展, 了解這塊的知識,這也有利於我們更加深入的了解 Python 的運行本質。
網上的例子都是通過 ctypes 或者 setup.py 的方式實現引用和編譯安裝,今天在這邊想試下最原始的方法~
1. 實現接口函數
接口函數是什麼意思?可以簡單理解成就是 Python 和 C 的對接函數,舉個例子:

從上述的例子中可以看到這個函數和傳統意義上的 C 用法有點不同了,特別是在函數形參那邊的PyObject self, PyObject args
第一個參數是 PyObject *self,這個參數是Python內部使用的,可以不用管;
第二個參數是 PyObject *args,這個參數非常重要,因為這個攬括了所有傳給函數的參數。它是一個參數列表,把所有的參數都整合到。
一個 string, 因此,如果我們需要解析這些參數需要用特定的方法!我們需要用到 PyArg_ParseTuple 來解開這個扣人心弦的入口!
PyArg_ParseTuple 函數說明:
args就是需要轉換的參數;
ii 就是參數類型的格式符號,這裏代表 int init;
後麵的 &arg1, &arg2 就是通過參數解析提取的值,存放的地方,這有點類似 C 的 scanf;
很明顯的,這三個參數,在數量上存在這一定的聯係,也就是,傳進去兩個 int參數,那麼就肯定是對應了兩個 ii,然後就會對應存在 兩個實際的"容器"內,這裏要注意,一不小心就會 Segmentation fault
對應有解析參數的,肯定也有 C模塊 值轉換成 Python對象 的,那就是 Py_BuildValue。
Py_BuildValue 函數說明:

第一個參數 和 PyArg_ParseTuple 的第二個參數一樣,都是格式化符號;
第二個參數是需要轉換的參數,函數 Py_BuildValue 會把所有的返回指都組裝成 tuple 給 Python
2. 定義方法列表

PyMethodDef 是一個 C結構體,用來完成一個映射,也就是便於方法查找,我們把需要被外麵調用的方法都記錄在這表內。
PyMethodDef 結構體成員說明:
第一個字段:在 Python 裏麵使用的方法名;
第二個字段:C 模塊內的函數名;
第三個字段:方法參數類型,是無參數(METH_NOARGS) , 還是有位置參數(METH_VARARGS), 還是其他等等;
第四個字段:方法描述,就是通過 help() 或者 doc 可以看到的;
需要注意的是,這個列表的最後必須以 {NULL, NULL, 0, NULL} 的形式來代表聲明結束,也有一些大佬用 {NULL, NULL},不過個人覺得寫完整也不會累到哪去, 相反會比較直觀。

正因為存在這樣的一份記錄表,Python 才能夠尋找到相應的函數
同樣的,如果我們想要找一個模塊的 Python 函數 對應什麼的 C模塊方法,也能通過這地方比較粗暴得知,例如 Python 的 list

3. 實現初始化函數 (關鍵)

需要特別注意的是,這個函數名不能像上麵那樣,這是有規定的,必須是 init + 模塊名字,比方說,我的最後編譯出來的文件是 test.so, 那我的函數名就是 inittest, 這樣在 Python 導入 test 模塊時,才能找到這個函數並調用。
這裏調用了 Py_InitModule 函數來將模塊名字和映射表結合在一起。表示 test 這個模塊使用 testMethods 這個映射表。
編譯導出

完整例子
test.c

test.py

熱門課程
專業講師指導 快速擺脫技能困惑相關文章
多種教程 總有一個適合自己專業問題谘詢
你擔心的問題,火星幫你解答為給新片造勢,迪士尼這次豁出去了,拿出壓箱底的一眾經典IP,開啟了夢幻聯動朱迪和尼克奉命潛入偏遠地帶臥底調查 截至11月24日......
此前Q2問答環節,鄒濤曾將《解限機》首發失利歸結於“商業化保守”和“灰產猖獗”,導致預想設計與實際遊玩效果偏差大,且表示該遊戲......
2025 Google Play年度遊戲頒獎:洞察移動遊戲新趨勢
玩家無需四處收集實體卡,輕點屏幕就能開啟驚喜開包之旅,享受收集與對戰樂趣庫洛遊戲的《鳴潮》斬獲“最佳持續運營遊戲”大獎,這不僅......
說明:文中所有的配圖均來源於網絡 在人們的常規認知裏,遊戲引擎領域的兩大巨頭似乎更傾向於在各自賽道上激烈競爭,然而,隻要時間足......
在行政服務優化層麵,辦法提出壓縮國產網絡遊戲審核周期,在朝陽、海澱等重點區將審批納入綜合窗口;完善版權服務機製,將遊戲素材著作......
未畢業先就業、組團入職、紮堆拿offer...這種好事,再多來一打!
眾所周知,火星有完善的就業推薦服務圖為火星校園招聘會現場對火星同學們來說,金三銀四、金九銀十並不是找工作的唯一良機火星時代教育......
同學您好!