【问题标题】:Cython static typing for class类的 Cython 静态类型
【发布时间】:2018-09-20 04:25:55
【问题描述】:

在 Cython 中,我们可以在参数中添加类型声明。

cdef int add(int a, int b):
  return a + b

但是,the official document 没有解释如何声明类对象。我想做这样的事情:

cdef MY_CLASS edit_class(MY_CLASS myclassobj):
   myclassobj.edit()
   return myclassobj

更具体地说,我想创建一个将(纯 Python)类作为参数并返回它的函数。我知道它可以在不指定类型的情况下工作,但我想知道我是否可以像为 int a 所做的一样(在参数中指定类型)

有什么办法吗?还是如this question 所说,Cython 不支持类?

【问题讨论】:

  • 您的 MY_CLASS 应该是纯 Python 类还是 cdef class
  • @ead 这是一个 Python 类。
  • 纯 Python 类不是静态类型,因此 Cython 不能对其进行静态类型。在这种情况下,您可以做的最好的事情是object

标签: cython


【解决方案1】:

它们被称为“扩展类型”,因此您可以更好地查找相关文档。严格来说,几乎所有的python都可以用cython编译。所以从这个意义上说,类肯定是“支持”的。但是,如果您想利用类型声明,则需要使用 cdef。有几种方法可以做到这一点。我制作了如下所示的 cython 类,并且通常会看到很好的加速:

cdef class MyClass:
# first initialise 'instance' variables
cdef public str string_1
cdef public int some_number

def __cinit__(self, a_string, a_number):
    self.string_1 = a_string
    self.some_number = a_number

【讨论】:

    【解决方案2】:

    Cython 确实支持 class ,并且可以使用 cdef 来完成。

    参考奥莱利,

    cdef 类语句告诉 Cython 创建扩展类型而不是常规类型 Python 类。

    类主体中的cdef 类型声明不是,尽管看起来, 类级属性。它们是 C 级实例属性;这种属性声明风格类似于 C++ 和 Java 等语言。

    对于扩展类型,所有实例属性必须以这种方式在类级别使用cdef 声明。”

    cdef class Particle:
        """Simple Particle extension type."""
        cdef double mass, position, velocity
    

    所以,Cython 确实支持 class ,CPython 也支持。

    【讨论】:

      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 2012-07-11
      • 2010-10-23
      • 2012-10-31
      • 1970-01-01
      • 2014-06-26
      • 2012-03-03
      • 1970-01-01
      相关资源
      最近更新 更多