Cython 多重返回
我想把这个简单的函数封装起来:
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的时候不行,出现了错误:AttributeError,没有属性pyfoo。如果我用def或者cpdef就可以正常工作。
在Cython中,有没有什么方法可以用cdef来做到这一点?
2 个回答
1
这个问题的关键在于,cdef 创建了一个具有 C 语言特征的函数,这种函数的调用方式是 C 语言的方式,Python 是无法直接调用它的。为了让 Python 能够调用这个函数,我们需要使用 cpdef 来为 cdef 函数提供一个 Python 的包装。
可以这样理解:cython 就像是一座连接 C 语言和 Python 的桥。cdef 就是在桥的 C 语言那一端,而 cpdef 则是在桥的 Python 那一端。
这里有一个关于 cython 的精彩讲座。
6
cdef
定义的函数不能被 Python 代码访问。这就是它们运行得快的原因:从 Python 调用函数总是比较慢。
解决办法是使用 cpdef
,这样既可以从 Python 访问,又能在 C 中调用时保持快速。或者,你也可以选择不从 Python 代码中调用它。