python調用CC++的方法各有什麼優勢,哪個最好?
01-29
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++域作用符在函數聲明和定義中的意義?