我有一个名为foo.pyx
的{{3}}文件,其中包含以下功能:
def add_one(int n):
cdef int m = n + 1
return m
cdef int c_add_one(int n):
return n + 1
我使用pyx
构建此cython -a foo.pyx
文件,然后执行:
>>> import foo
>>> foo.add_one(5)
6
>>> foo.c_add_one(5)
AttributeError: 'module' object has no attribute 'c_add_one'
所以看起来我无法从python中调用c_add_one
。使用cdef
声明函数有什么好处?
答案 0 :(得分:7)
cdef
和cpdef
函数。常规def
函数是完整的Python对象。它们需要引用计数,GIL等。cdef
,它将不会向Python用户公开。如果该功能从未打算用于公共消费(例如,因为它不检查其参数,或者与将来可能改变的实现细节有关),这是有益的。当然,用户仍然可以通过C / Cython来规避这一点,但这样做比大多数人都会烦恼更麻烦。通过这种方式,它类似于双下划线名称修改。