我有一个带有Python包装器的C ++库(用SWIG编写)。该库允许执行小的用户定义代码(回调),例如向量上的元素操作。即而不只是一个+你可以做任意二进制函数。现在,这是通过接受二进制函数的可调用Python对象并调用它来实现的。它可以工作,但是比每次迭代都不需要在Python中反弹的代码慢大约80倍。
如何编写/构建/导入Cython函数可以传递到我的C ++库中,以便C ++库可以直接调用它?
修改 如果我只是坚持C,那么我会写一些类似
的东西EWise(double (*callback)(double, double))
然后,EWise将callback(10, 20);
或其他人。我希望用Cython编写callback
,使用用户想要的任何名称,并且必须通过Python以某种方式将指针传递给我的C ++库。不知怎的,这是我不清楚的地方。
答案 0 :(得分:15)
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's callback mechanism
func_type = CFUNCTYPE(c_double, c_double, c_double)
your_library.set_callback_function ( func_type(user_modules.cython_function) )
答案 1 :(得分:2)
您可以通过执行纯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”来查看它们不是运行内容所涉及的python代码。所以它适用于您的c库。
答案 2 :(得分:0)