2010-08-02 172 views
0

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

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

我遇到的问题是如何将PyObject *转换回类实例,PyArg_parse提供了O &选项,但是我所看到的仅仅是一个指向内存中C++对象的指针......我怎么才能得到它功能?

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

感谢

回答

1

我没有试过Boost.Python的,但我用纯粹的C以及Cython延长了Python。我推荐Cython;如果你足够小心,你可以获得与原始C相同的代码,但是代码少得多。

关于效率,它是相对的。这取决于你想要做什么以及如何做。例如,我经常做的事情是在C中编写一些图像处理或矩阵操作的内部循环,并使用指向矩阵的指针作为参数,由Python调用该函数。矩阵本身不会被复制,所以开销很小。

+0

让我们带来一些抽象。我有一个简单的函数: def sum(a,b):return a + b。现在让我们想象它从C调用了几十万次,因此每微秒值得这里。显然这只是一个抽象,即我知道这样做是没有意义的。在现实生活中,我有一个更好的例子。所以我在这里需要的是获得调用之间的最小延迟,这意味着我需要优化实际函数总和的调用之间的时间间隔。 在这种情况下最好的方法是什么? – Alex 2010-08-02 22:33:06

+0

所以你想从C调用Python?无论如何,Python和C之间的接口的开销主要来自于必须将对象的东西(例如,在C中有一个int,在Python中有一个更大的整数)和处理引用计数。这是'快速',但如果要调用的函数非常简单并且必须在紧密循环中调用,则可能会有太多开销。为了了解所涉及的工作,Cython可以选择编写一个html文件来显示为Cython/Python行生成的C代码。这会让您了解每项操作的成本。 – dimatura 2010-08-04 05:50:32