1
來自MATLAB,我正在尋找一些方法來創建函數,這些函數是通過包裝C函數派生的。我遇到了Cython,ctypes,SWIG。我的目的不是要通過任何因素提高速度(但它肯定會有所幫助)。用於Python的MEX等價物(C包裝函數)
有人可以爲這樣的目的推薦一個體面的解決方案。 編輯:做這份工作最受歡迎/採用的方式是什麼?
謝謝。
來自MATLAB,我正在尋找一些方法來創建函數,這些函數是通過包裝C函數派生的。我遇到了Cython,ctypes,SWIG。我的目的不是要通過任何因素提高速度(但它肯定會有所幫助)。用於Python的MEX等價物(C包裝函數)
有人可以爲這樣的目的推薦一個體面的解決方案。 編輯:做這份工作最受歡迎/採用的方式是什麼?
謝謝。
我發現weave適用於較短的功能,並且具有非常簡單的界面。
爲了讓您瞭解界面的簡單性,下面是一個示例(摘自PerformancePython website)。注意轉換器如何處理多維數組轉換(在這種情況下爲Blitz)。
from scipy.weave import converters
def inlineTimeStep(self, dt=0.0):
"""Takes a time step using inlined C code -- this version uses
blitz arrays."""
g = self.grid
nx, ny = g.u.shape
dx2, dy2 = g.dx**2, g.dy**2
dnr_inv = 0.5/(dx2 + dy2)
u = g.u
code = """
#line 120 "laplace.py" (This is only useful for debugging)
double tmp, err, diff;
err = 0.0;
for (int i=1; i<nx-1; ++i) {
for (int j=1; j<ny-1; ++j) {
tmp = u(i,j);
u(i,j) = ((u(i-1,j) + u(i+1,j))*dy2 +
(u(i,j-1) + u(i,j+1))*dx2)*dnr_inv;
diff = u(i,j) - tmp;
err += diff*diff;
}
}
return_val = sqrt(err);
"""
# compiler keyword only needed on windows with MSVC installed
err = weave.inline(code,
['u', 'dx2', 'dy2', 'dnr_inv', 'nx', 'ny'],
type_converters=converters.blitz,
compiler = 'gcc')
return err
它看起來像你遇到了大多數的標準方式來做到這一點(除了學習python C-API)。你的問題到底是什麼? – mgilson 2012-07-23 14:02:27
嗨,我正在尋找這樣做的最流行的方法,其中涉及最小的代碼更改(如MEX)。 – SEU 2012-07-23 14:07:39
對於大量的界面風格,您可以根本不用修改代碼,只使用SWIG編寫一個簡單的界面文件作爲額外的東西。但這個問題很主觀。 – Flexo 2012-07-23 14:40:43