【问题标题】:cython multiple returncython 多次返回
【发布时间】:2011-10-17 08:35:45
【问题描述】:

我想包装这个简单的函数:

       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 no attribute pyfoo 如果我使用 def 或 cpdef 而不是 cdef,它可以工作。

cython 有什么方法可以使用 cdef 做到这一点吗?

【问题讨论】:

    标签: python cython


    【解决方案1】:

    cdef 函数不能被 Python 代码访问。这就是它们速度快的原因:从 Python 调用函数总是很慢。

    解决方案是改用cpdef,这样它既可以从 Python 访问,又可以在从 C 调用时快速。或者,不要从 Python 代码调用它。

    【讨论】:

    • 谢谢,我明白了。
    【解决方案2】:

    问题似乎是 cdef 创建了一个具有 C 签名和 C 调用语义的函数。它们不能被 Python 调用。 cpdef 应该用于为 cdef 函数提供 Python 包装器。

    这样看:cython 提供了 C 和 python 之间的桥梁。 cdef 是桥的 C 端。 cpdef 位于桥的 Python 端。

    关于cython 的讨论很好。

    【讨论】:

    • 其实def在Python端。 cpdefboth 两端;既可以从 Python 调用,也可以从 C 快速调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2015-08-20
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 2011-03-27
    相关资源
    最近更新 更多