在 Python 中是否有使用内联 C 代码的内置方法?
Is there a built-in way to use inline C code in Python?
即使 numba
、cython
(尤其是 cython.inline
)存在,在某些情况下,在 Python 中包含内联 C 代码也会很有趣。
是否有内置方式(在 Python 标准库中)包含内联 C 代码?
PS: scipy.weave 曾经提供过这个,但它只是 Python 2.
直接在 Python 标准库中,可能不是。但是有可能在 Python 中使用 cffi
模块 (pip install cffi
).
有一些非常接近内联 C 的东西
这是一个受 this article and this question 启发的示例,展示了如何在 Python + "inline" C:
中实现阶乘函数
from cffi import FFI
ffi = FFI()
ffi.set_source("_test", """
long factorial(int n) {
long r = n;
while(n > 1) {
n -= 1;
r *= n;
}
return r;
}
""")
ffi.cdef("""long factorial(int);""")
ffi.compile()
from _test import lib # import the compiled library
print(lib.factorial(10)) # 3628800
备注:
ffi.set_source(...)
定义实际的 C 源代码
ffi.cdef(...)
相当于.h
头文件
- 你当然可以在后面添加一些清理代码,如果你最后不需要编译库(但是,
cython.inline
做同样的事情,编译后的.pyd文件默认不清理, see here)
- 这种快速内联使用在 原型设计 / 开发阶段特别有用。一切准备就绪后,您可以将构建(只做一次)和导入预编译库的其余代码分开
好得令人难以置信,但它确实有效!
即使 numba
、cython
(尤其是 cython.inline
)存在,在某些情况下,在 Python 中包含内联 C 代码也会很有趣。
是否有内置方式(在 Python 标准库中)包含内联 C 代码?
PS: scipy.weave 曾经提供过这个,但它只是 Python 2.
直接在 Python 标准库中,可能不是。但是有可能在 Python 中使用 cffi
模块 (pip install cffi
).
这是一个受 this article and this question 启发的示例,展示了如何在 Python + "inline" C:
中实现阶乘函数from cffi import FFI
ffi = FFI()
ffi.set_source("_test", """
long factorial(int n) {
long r = n;
while(n > 1) {
n -= 1;
r *= n;
}
return r;
}
""")
ffi.cdef("""long factorial(int);""")
ffi.compile()
from _test import lib # import the compiled library
print(lib.factorial(10)) # 3628800
备注:
ffi.set_source(...)
定义实际的 C 源代码ffi.cdef(...)
相当于.h
头文件- 你当然可以在后面添加一些清理代码,如果你最后不需要编译库(但是,
cython.inline
做同样的事情,编译后的.pyd文件默认不清理, see here) - 这种快速内联使用在 原型设计 / 开发阶段特别有用。一切准备就绪后,您可以将构建(只做一次)和导入预编译库的其余代码分开
好得令人难以置信,但它确实有效!