从Python调用Cython C函数

8 投票
1 回答
5111 浏览
提问于 2025-05-01 13:44

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

撰写回答