【发布时间】:2017-10-16 14:48:58
【问题描述】:
我一直在尝试用 cython 封装 C++。我试图了解在扩展类型方法中键入 self 的含义。
在docs 中,self 没有显式键入,但似乎与键入 self 相关的速度可能会加快。
但是,在我有限的实验中,显式输入 self 似乎不会提高性能。处理self的幕后是否有特殊的魔法,或者这纯粹是一种风格的事情?
编辑为清楚起见:
通过输入self,我的意思是为方法的self 参数提供类型信息。即:
cdef class foo:
cpdef bar(self):
# do stuff with self
对
cdef class foo:
cpdef bar(foo self):
# do stuff with self
【问题讨论】:
-
我同意为自己的类对象键入“self”或任何其他名称应该是纯粹的约定问题...
-
我认为没有任何区别,因为在这两种情况下,生成的 c 代码
self在 c 部分转换为struct xxxxxx_foo *__pyx_v_self,在 Python 包装器中转换为PyObject *__pyx_v_self。(您可以轻松通过%%cython -acell magic 在jupyter notebook 中检查) -
@oz1 看起来你对一般情况是正确的。我开始走这条路的原因是显然需要在
__eq__方法中键入self。我做了你的笔记本技巧,__eq__和其他神奇功能确实存在差异。 -
(struct __pyx_obj_46_cython_magic_a97a4609d42faba2d2376a5b3cd09730_foo *)__pyx_v_self一个,(PyObject *)__pyx_v_self另一个 -
据我所知,特殊方法必须是
def函数,因此在python包装器中self应该总是(PyObject *)__pyx_v_self。实际上,包装函数在签名中有所不同,一个是 (PyObject *) 表示未键入self,另一个是struct *,它可能具有较少的指针间接寻址。我觉得python部分的性能差别不大。
标签: cython