Python 的 MEX 等效项(C 包装函数)

问题描述 投票:0回答:1

来自 MATLAB,我正在寻找某种方法在 Python 中创建源自包装 C 函数的函数。我遇到了 Cython、ctypes、SWIG。我的目的不是通过任何因素提高速度(但这肯定会有所帮助)。

有人可以为此目的推荐一个不错的解决方案吗? 编辑:做这项工作最流行/采用的方式是什么?

谢谢。

python swig ctypes cython mex
1个回答
1
投票

我发现 weave 对于较短的函数非常有效,并且界面非常简单。

为了让您了解该界面有多么简单,这里有一个示例(取自 PerformancePython 网站)。请注意转换器(在本例中为 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
© www.soinside.com 2019 - 2024. All rights reserved.