我正在寻找以下内容的精确定义,以便在Cython中进行编程:
object
以及它们与Cython从定义扩展类型的.pxd
和.pyx
文件生成的C / C ++代码编译的共享对象之间的区别。
编辑:我的意思是一个人用C / C ++编写的代码以及Cython生成的代码。编译常规的C / C ++代码和Cython生成的代码会产生不同的二进制代码,对吗? Cython所做的工作使它值得不使用C / C ++编写所有内容?
(奖励:CPython源代码中PyObject的定义)
我尝试从官方教程中学习cython并阅读文档,但是这种混淆是进一步开发的主要障碍。
答案 0 :(得分:0)
您在Python代码中操作的所有内容最终都是“ Python对象”。这些由C中的PyObject
结构实现/表示,
PyObject
的链接。(几乎)所有Python程序都应在Cython中运行。因此,如果您在Cython中编译Python程序,则您仍在使用Python对象。 Cython生成一些C代码,这些代码使用Python C API(即,将它们用作PyObject*
)来操纵这些Python对象。您通常不必担心它的实际作用,因为它的行为与Python中相同-它们会自动被引用计数。
然后在Cython中可以指定类型(例如cdef int
,cdef char*
或C结构)。这些直接是C类型,适当地使用它们可以提高速度。它们不是Python对象(因此,如果要将它们传递回纯Python代码,则可能需要将其转换为Python对象-Cython知道如何对某些(但不是全部)C类型执行此操作)。 Cython中的一般规则是,除非另有说明,否则一切都是Python对象。
Cython中的object
关键字是一种将类型指定为Python对象的方法。 (它在Python中也具有其通常的含义,它表示“空”对象的类型)。通常您不必使用它,因为Cython假定默认情况下事物是Python对象,除非您另有说明。
“ Cython对象”是指类型定义为cdef class Something
的对象。这些仍然是Python对象,但是“有用数据”的存储方式是Cython知道的,从而可以从Cython快速访问。通常,这些有用的数据由基本的C类型(例如int
或char*
)组成。
如果您确实需要,可以直接在Cython中使用C PyObject
,自己调用C API函数。如果您执行此操作,则Cython 不会替您处理引用计数(就像您将类型声明为object
或根本不声明类型一样)。因此,您通常不应该这样做。
自己编写C代码和让Cython生成C代码之间没有真正的区别-您可以做任何事情。它确实为您处理了很多繁琐且难于获得的东西,这是主要优点。