从C ++调用Cython函数

| 我有一个带有Python包装器(用SWIG编写)的C ++库。该库允许执行小的用户定义代码(回调),例如对向量进行逐元素操作。即而不是仅+,您可以执行任何任意的二进制函数。现在,这是通过为二进制函数接受一个可调用的Python对象并对其进行调用来实现的。它可以工作,但是比不必在每次迭代中上下弹跳的代码慢大约80倍。 我如何编写/构建/导入Cython函数可以传递到我的C ++库中,以便可以直接由C ++库调用? 编辑: 如果我只是坚持使用C,那么我会写类似
EWise(double (*callback)(double, double))
EWise会等于或等于1。我想用用户想要的任何名称用Cython编写ѭ2,并且必须以某种方式通过Python将指向它的指针传递给我的C ++库。那是我不清楚的地方。
已邀请:
cython的窍门是使用关键字public
cdef public double cython_function( double value, double value2 ):
    return value + value2
然后,命令
cythonize <your_file.pyx>
<your_file.c>
将创建标头
<your_file.h>
,您可以将其包括在内。 另外,您可以自己创建标题:
#ifdef __cplusplus {
extern \"C\"
#endif

double cython_function( double value, double value2 );

#ifdef __cplusplus
}
#endif
更新: 然后从Python覆盖一点,就可以使用ctypes的回调机制
func_type = CFUNCTYPE(c_double, c_double, c_double)

your_library.set_callback_function ( func_type(user_modules.cython_function) )
您可以通过执行纯
cdef
函数来实现:
# declare the prototype of your function
ctypedef void (*callback_ptr)(int arg)

# declare your function as cdef
cdef void my_callback(int arg):
    print \'doing some python here\', arg

# now, you can use the cdef func as a callback
# in pure C !
cdef void run():
    cdef callback_ptr p = my_callback
    p(42)

if __name__ == \'__main__\':
    run()
注意:您可以使用\“ cython -a \”来查看它们是否与运行内容无关。因此它将与您的c库一起使用。
将Python嵌入另一个应用程序可能会很有用。

要回复问题请先登录注册