【问题标题】:Python extensions - performancePython 扩展 - 性能
【发布时间】:2010-08-02 03:41:10
【问题描述】:

我正在使用 Boost.Python 来扩展 python 程序的功能。 Python 脚本对原生模块进行了大量调用,所以我非常关心 python-to-cpp 类型转换和数据编组的性能。

我决定尝试通过 Python C API 以本机方式公开方法。可能有人之前已经尝试过吗?任何成功...至少在理论上?

我遇到的问题是如何将 PyObject* 转换回类实例,PyArg_parse 提供 O& 选项,但我正在寻找的只是指向内存中 C++ 对象的指针......我怎样才能在函数中得到它?

if ( PyArg_ParseTuple(args, "O", &pyTestClass ) ) { // how to get TestClass from pyTestClass ?? }

谢谢

【问题讨论】:

    标签: python performance boost native


    【解决方案1】:

    我没有尝试过 Boost.Python,但我已经使用原始 C 以及 Cython 扩展了 Python。我推荐 Cython;如果你足够小心,你可以获得与原始 C 相同效率的代码,但样板代码要少得多。

    关于效率,是相对的。这取决于你想做什么以及如何去做。例如,我经常做的是用 C 语言编写一些图像处理或矩阵运算的内部循环,并让 Python 调用这个函数,并将指向矩阵的指针作为参数。矩阵本身不会被复制,因此开销很小。

    【讨论】:

    • 让我们引入一些抽象。我有一个像这样的简单函数:def sum(a, b): return a + b。现在让我们想象一下它被 C 调用了数十万次,所以每一微秒都值得在这里。显然这只是一个抽象,即我知道这样做没有意义。在现实生活中,我有一个更好的例子。所以我在这里需要的是获得调用之间的最小延迟,这意味着我需要优化真正函数 sum 的调用之间的时间,以实现它应该做的事情。在这种情况下最好的方法是什么?
    • 所以你想从C调用Python?无论如何,Python 和 C 之间接口的开销主要来自于必须将事物装箱/拆箱到对象中(例如,在 C 中你有一个 int,在 Python 中你有一个更大的整数)和处理引用计数。它“很快”,但如果要调用的函数非常简单并且必须在紧密循环中调用,则可能会产生太多开销。为了了解所涉及的工作,Cython 可以选择编写一个 html 文件,该文件显示为 Cython/Python 行生成的 C 代码。这让您了解每个操作的成本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多