python - 扩展 python - swig,而不是 swig 或 Cython

标签 python c++ c swig cython

我在我的 python 代码中发现了瓶颈,尝试了 Psycho 等。然后决定编写一个 c/c++ 扩展来提高性能。

在 swig 的帮助下,您几乎不需要关心参数等。一切正常。

现在我的问题是:swig 创建了一个相当大的 py 文件,它在调用实际的 .pyd 或 .so 代码之前做了很多“检查”和“PySwigObject”。

如果您手写这个文件或让 swig 来做,你们中的任何人是否有任何经验是否可以获得更多的性能。

最佳答案

如果您不打算使用 swig 为其他语言生成绑定(bind),则应该考虑 Boost.Python。

如果你有很多函数和类要绑定(bind),Py++是一个很棒的工具,可以自动生成所需的代码来进行绑定(bind)。

Pybindgen 也可能是一个选项,但它是一个新项目,不如 Boost.Python 完整。

编辑:

也许我需要更明确地说明利弊。

  • 挥拳:

    亲:您可以为许多脚本语言生成绑定(bind)。

    缺点:我不喜欢解析器的工作方式。我不知道是否取得了一些进展,但两年前 C++ 解析器非常有限。大多数时候我不得不复制/过去我的 .h header 添加一些 %字符并为 swig 解析器提供额外提示。

    我还需要不时处理 Python C-API 以进行(并非如此)复杂的类型转换。

    我不再使用它了。
  • Boost.Python:

    亲:
    这是一个非常完整的图书馆。它允许您使用 C-API 执行几乎所有可能的操作,但使用 C++。我从来不需要用这个库编写 C-API 代码。我也从未遇到过由于库而导致的错误。绑定(bind)代码要么像魅力一样工作,要么拒绝编译。

    如果您已经有一些 C++ 库要绑定(bind),它可能是目前可用的最佳解决方案之一。但是如果你只有一个小的 C 函数要重写,我可能会尝试使用 Cython。

    缺点:如果您没有预编译的 Boost.Python 库,您将使用 Bjam(有点像 make 替换)。我真的很讨厌 Bjam 及其语法。

    使用 B.P 创建的 Python 库往往会变得肥胖。它还需要一个 拍品 是时候编译它们了。
  • Py++(已停产):它使 Boost.Python 变得简单。 Py++ 使用 C++ 解析器来读取您的代码,然后自动生成 Boost.Python 代码。你也得到了作者的大力支持(不,这不是我;-))。

    缺点:只有 Boost.Python 本身的问题。更新:截至 2014 年,该项目现在看起来已停止。
  • 宾得根:

    它生成处理 C-API 的代码。您可以在 Python 文件中描述函数和类,也可以让 Pybindgen 读取您的 header 并自动生成绑定(bind)(为此它使用 pygccxml,一个由 Py++ 的作者编写的 Python 库)。

    缺点:这是一个年轻的项目,团队比 Boost.Python 小。仍然存在一些限制:您不能对 C++ 类使用多重继承,回调(虽然不是自动的,但可以编写自定义回调处理代码)。 Python 异常到 C 的翻译。

    这绝对值得一看。
  • 一个新的:
    2009 年 1 月 20 日,Py++ 的作者宣布了一个 new package用于将 C/C++ 代码与 python 接口(interface)。它基于 ctypes。我还没试过,但我会的!注意:这个项目看起来已经停止了,就像 Py++。
  • CFFI : 直到最近我才知道这个的存在,所以现在我不能发表我的意见。看起来您可以在 Python 字符串中定义 C 函数并直接从同一个 Python 模块调用它们。
  • Cython :这是我目前在我的项目中使用的方法。基本上你在特殊的 .pyx 文件中编写代码。这些文件被编译(翻译)成 C 代码,而 C 代码又被编译成 CPython 模块。
    Cython 代码看起来像常规 Python(实际上纯 Python 是有效的 .pyx Cython 文件),但您也可以了解更多信息,例如变量类型。这种可选的类型允许 Cython 生成更快的 C 代码。 Cython 文件中的代码既可以调用纯 Python 函数,也可以调用 C 和 C++ 函数(以及 C++ 方法)。

    我花了一些时间在 Cython 中思考,在相同的代码中调用 C 和 C++ 函数,混合 Python 和 C 变量,等等。但它是一种非常强大的语言,拥有活跃(2014 年)和友好的社区。
  • 关于python - 扩展 python - swig,而不是 swig 或 Cython,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/456884/

    相关文章:

    c++ - 在不剪切文本的情况下设置 QDialog 的固定大小

    c - 就 cpu 而言,coSTLy 如何成为低争用互斥体

    python - 如何创建具有精确单位和测量值的图

    python - 最小 DOM - 在根节点上设置一个属性

    python - Unicode 名称的详细信息\N 记录了吗?

    c++ - QtQuick 使用 QQuickTextNode

    c++ - 通过指针传递 char 并得到不同的结果

    c - 当我使用 free() 释放分配的指针时出现无效指针错误

    c - 做指针运算会产生除法成本吗

    python - AmazonS3 - 根据特定权限与 Python Boto 连接