C++-Python 互操作:更快地编组数据

Posted

技术标签:

【中文标题】C++-Python 互操作:更快地编组数据【英文标题】:C++-Python Interop: Marshalling data faster 【发布时间】:2015-02-20 21:26:25 【问题描述】:

我正在开发具有 C++ 和 Python API 的应用程序,并且正在实现需要在两种语言中使用的 API 调用。此 API 发回的部分数据是表示颜色信息的结构数组:

struct 
    float r;
    float g;
    float b;
    float a;
 Foo_Pixel;

在我的互操作代码中,我如此编组数据:

Foo_Pixel color;

PyObject* tileValues = PyList_New( numValues );

for (int pixelIndex = 0; pixelIndex < numValues; pixelIndex++)

  color = value[pixelIndex];
  PyObject* newColourItem = Py_BuildValue("ffff", color.r, color.g, color.b, color.a);
  PyList_SetItem(tileValues, pixelIndex, newColourItem);

基本上,我正在循环提供的数据并构建一个元组列表供用户使用。但是,这对我来说似乎有点低效。有没有更快的方法从浮点结构数组中创建 PyObject?

【问题讨论】:

【参考方案1】:

Py_BuildValue 可以构建您想要的元组之前,它需要解析您给它的格式字符串以确定其参数的类型和数量以及返回的PyObject 将是什么。如果你提前知道这一切,你可以跳过这些步骤,直接构建元组:

PyObject* newColourItem = PyTuple_New(4);
PyTuple_SET_ITEM(newColourItem, 0, PyFloat_FromDouble(color.r));
PyTuple_SET_ITEM(newColourItem, 1, PyFloat_FromDouble(color.g));
PyTuple_SET_ITEM(newColourItem, 2, PyFloat_FromDouble(color.b));
PyTuple_SET_ITEM(newColourItem, 3, PyFloat_FromDouble(color.a));

您也会注意到我使用了PyTuple_SET_ITEM 而不是PyTuple_SetItem。除了第一个不执行任何错误检查外,这两个函数是相同的。因此,如果给它一个错误的索引,它会更有效,但也会很危险。但是,这不是问题,因为我们确切地知道要填充哪些索引。

同样,您可以将PyList_SetItem 替换为PyList_SET_ITEM。由于您已经知道您使用的索引是有效的,因此这里不需要检查错误。

这就是你所能做的。您正在做的事情没有 API 函数,并且您发布的代码已经非常有效。如果您正在尝试提高应用程序的整体速度,我会寻找其他地方进行优化。

【讨论】:

以上是关于C++-Python 互操作:更快地编组数据的主要内容,如果未能解决你的问题,请参考以下文章

使用互操作将 datagridview 导出到 excel

Python与C/C++互操作

C++/C# 互操作中的内存映射和 P/Invoke 性能

如何在 C# 和 C++ 之间进行互操作

互操作 C++ 时释放分配的内存

.NET 中本机互操作性的代码组织