我想包装这个简单的函数:
double foo(int a, int* b)
{
double div = ((double) a) / ((double) *b);
*b = a + (*b);
return div;
}
我想要做的是:
cdef pyfoo(int c, int d):
res = foo(c, &d);
return (res, d)
我想返回一个值列表,但是使用cdef它不起作用 它给了我erroe:AttributeError没有属性pyfoo 如果不使用cdef,我使用def或cpdef就可以了。
使用cdef在cython中有一些方法吗?
答案 0 :(得分:7)
cdef
个函数。这就是为什么它们很快:从Python调用函数总是很慢。
解决方案正在使用cpdef
,因此它可以从Python访问,并且在从C调用时可以快速访问。或者,不要从Python代码中调用它。
答案 1 :(得分:1)
问题似乎是cdef创建了一个带有C签名和C调用语义的函数。它们不能被Python调用。应该使用cpdef来提供围绕cdef函数的Python包装器。
这样看:cython正在提供C和python之间的桥梁。 cdef是桥的C端。 cpdef位于桥的Python端。
关于cython的讨论很好。