【问题标题】:Is there a built-in way to use inline C code in Python?是否有在 Python 中使用内联 C 代码的内置方法?
【发布时间】:2021-03-24 00:46:54
【问题描述】:

即使存在numbacython(尤其是cython.inline),在某些情况下,在 Python 中使用内联 C 代码也会很有趣。

是否有内嵌 C 代码的内置方式(在 Python 标准库中)?

PS:scipy.weave 曾经提供过这个,但它只是 Python 2。

【问题讨论】:

  • 我只是想补充一点,这里问的这个“内联代码”与C99中的关键字inline关系不大。
  • @YiFei 是的,我说的是在 Python 代码中包含内联 C 代码,就像在 C 代码中执行内联 ASM 一样。

标签: python c python-3.x cython inline


【解决方案1】:

直接在 Python 标准库中,可能不是。但是使用 cffi 模块 (pip install cffi) 可以在 Python 中拥有非常接近内联 C 的东西。

这是一个示例,灵感来自this articlethis question,展示了如何在 Python +“内联”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
  • 这种快速内联使用在原型设计/开发阶段特别有用。一切准备就绪后,您可以将构建(您只执行一次)与导入预编译库的其余代码分开

这似乎好得令人难以置信,但它似乎有效!

【讨论】:

  • cffi 不在 Python 标准库中,因此这不满足您在问题中提出的约束。
  • 另外,您生成的_test 模块实际上可能无法导入(取决于sys.path),并且您将在任何目录中留下一堆生成的扩展模块您在其中运行此代码。cffi 不打算像这样使用 - 您正在使用的接口打算在“构建步骤”期间提前运行,生成一个扩展模块,然后可以与您的代码并多次导入,无需重新生成。
  • @user2357112supportsMonica 如果你看看 cython.inline 是怎么做的,它是一样的,它“留下一堆生成的扩展模块”,在 Windows 上查看你的 C:\Users\User\.cython\inlin 文件夹;)见这里:@987654324 @(在 inline 执行完成很久之后)。
  • 是的,但是您在当前工作目录中生成 _test 模块,而不是在一个专用区域中,您可以安全地留下一堆垃圾。当前工作目录不是甚至保证在sys.path 上(当它没有自己的问题时,将其添加到sys.path)。
  • 我绝对可以看到它使原型制作更加方便。
猜你喜欢
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 2010-09-10
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多