標籤:

python調用CC++的方法各有什麼優勢,哪個最好?

python調用CC++有不少辦法,比如swig,boost,ctypes,還有python提供的調用C的API.....

大家平時都習慣用哪種方法呢,或者還有哪些更好的辦法,這些辦法各有怎樣的優勢呢?


不要求性能ctypes或者cffi,需要性能cython或者手寫module,其它都是邪路。最好的方法是全部寫成ctypes,或者cffi,送上線跑,有空再把最慢的一兩個介面換成cython


cython最好,其次是原生介面

cython的優勢在於它生成一大坨代碼的性能竟然和手寫的c代碼性能差不多,真是日了狗了


最方便的是ctypes,C/C++代碼直接編成動態庫載入,但是傳遞參數的時候有些坑要注意,效率略低,不過肯定比Python高不少。

性能最好的是手寫module,能獲得幾乎不低於C的執行效率,缺點是不支持面向對象(這個可以自己包裝)。對執行效率有要求的基本上都會用C寫再封裝,numpy等module的速度還是沒的說的。

cython結合Python和C的優點,把Python或cython代碼轉為C代碼編譯成moulle,速度比Python快,寫代碼比C語言方便尤其是面向對象方面的。對於不是對效率有非常苛刻要求的cython可以說是不二選擇。

boost.python庫可以非常方便的實現Python與C++的雙向互動,沒有用過不好說。


我用的是swig。如果你已經有一個c/c++的library,把export給python用的c函數聲明放到一個頭文件里,再寫一個swig.i的配置文件就行了。配置文件的作用就是讓swig幫你生成wrap code,wrap code負責讓python調用你的c/c++函數時可以像調用普通python那樣,比如c/c++函數要一個array,那麼python就直接傳一個python list給它,返回也是,如果c/c++函數要一個struct*,那麼python可以直接傳給它一個python class object給它。不過,這得需要你能改c/c++這頭的源代碼,因為生成的wrap文件要c/c++的項目一起build,最終生成一個pyd作為python module被python使用。缺點就是寫swig.i配置文件時得去學習它的用法,不過配置文件還是很簡單的。


boost支持numpy了


c程序用原生介面寫,其次cython。

c++11的話,用pybind11


我之前工作中一直用pybind11,對C++11的支持很好,API比較簡單並且更新也很快,它很多東西跟boost很像。沒有深入用過其他幾種所以也沒有很多發言權,提供多一個選項供大神們討論哈


推薦閱讀:

我寫C++喜歡用繼承有問題么?
github 上有哪些遊戲或者遊戲開發相關的炫酷的user或者repo?
noexcept標識符為什麼不這樣設計?
C語言int型(2位元組)數據的值的範圍為什麼是-2^15~(2^15-1)?
C++域作用符在函數聲明和定義中的意義?

TAG:Python | CC |