2012-07-23 97 views
1

来自MATLAB,我正在寻找一些方法来创建函数,这些函数是通过包装C函数派生的。我遇到了Cython,ctypes,SWIG。我的目的不是要通过任何因素提高速度(但它肯定会有所帮助)。用于Python的MEX等价物(C包装函数)

有人可以为这样的目的推荐一个体面的解决方案。 编辑:做这份工作最受欢迎/采用的方式是什么?

谢谢。

+4

它看起来像你遇到了大多数的标准方式来做到这一点(除了学习python C-API)。你的问题到底是什么? – mgilson 2012-07-23 14:02:27

+0

嗨,我正在寻找这样做的最流行的方法,其中涉及最小的代码更改(如MEX)。 – SEU 2012-07-23 14:07:39

+0

对于大量的界面风格,您可以根本不用修改代码,只使用SWIG编写一个简单的界面文件作为额外的东西。但这个问题很主观。 – Flexo 2012-07-23 14:40:43

回答

1

我发现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