Cython 多重返回

3 投票
2 回答
3913 浏览
提问于 2025-04-17 04:27

我想把这个简单的函数封装起来:

       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 代码中调用它。

撰写回答