从Python调用Cython C函数
我有一个叫做 Cython
的文件,文件名是 foo.pyx
,里面包含了一些函数:
def add_one(int n):
cdef int m = n + 1
return m
cdef int c_add_one(int n):
return n + 1
我用 cython -a foo.pyx
来构建这个 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
声明一个函数有什么好处呢?
1 个回答
7
- 速度: Cython 和 C 可以比普通的 Python 函数更快地调用
cdef
和cpdef
函数。普通的def
函数是完整的 Python 对象,它们需要进行引用计数、处理全局解释器锁(GIL)等操作,这些都会拖慢速度。 - 封装性: 如果一个函数被声明为
cdef
,那么它就不会被 Python 用户看到。这对于那些本来就不打算让公众使用的函数很有好处(比如因为它不检查参数,或者涉及到将来可能会改变的实现细节)。当然,用户仍然可以通过 C 或 Cython 来绕过这个限制,但这样做会比较麻烦,大多数人不会去费这个劲。因此,这种方式有点像双下划线命名混淆。