从Python调用Cython C函数

时间:2014-11-04 15:11:00

标签: python cython

我有一个名为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声明函数有什么好处?

1 个答案:

答案 0 :(得分:7)

  1. 速度:Cython和C可以比常规函数更快地调用cdefcpdef函数。常规def函数是完整的Python对象。它们需要引用计数,GIL等。
  2. 封装:如果声明了一个函数cdef,它将不会向Python用户公开。如果该功能从未打算用于公共消费(例如,因为它不检查其参数,或者与将来可能改变的实现细节有关),这是有益的。当然,用户仍然可以通过C / Cython来规避这一点,但这样做比大多数人都会烦恼更麻烦。通过这种方式,它类似于双下划线名称修改。