2

MATLABから来て、C関数のラッピングから派生したPythonで関数を作成する方法を探しています。Cython、ctypes、SWIGに出くわしました。私の意図は、いかなる要因によっても速度を向上させることではありません(それでも確かに役立ちます)。

誰かがそのような目的のためにまともな解決策をお勧めできますか?編集:この仕事をするための最も人気のある/採用された方法は何ですか?

ありがとう。

4

1 に答える 1

1

weaveは短い関数で非常にうまく機能し、非常にシンプルなインターフェイスを備えていることがわかりました。

インターフェイスがいかに簡単であるかを理解するために、ここに例を示します(PerformancePython Webサイトから取得)。多次元配列変換がコンバーター(この場合は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
于 2012-07-23T15:35:50.487 に答える