将c++中的浮点数数组返回给Python

Return an array of floats in C++ to Python

本文关键字:返回 Python 数组 浮点数 c++      更新时间:2023-10-16

我很确定我没有在正确的地方寻找,因为关于这个主题的信息非常难以获得。

我在c++中有一个小函数,Python会调用它,它会创建一个小的浮点数数组并将它们返回给Python。

首先,似乎你不能使用Py_BuildValue()在c++中作为Python中的列表返回任意大小的数组(我不清楚为什么应该这样做)。这里有一篇旧的但仍然相关的文章建议实例化一个PyList对象,用数组中的元素填充它,然后返回它。

这是一个可以接受的解决方案。然而,我的数字是c++风格的浮点数。虽然Python库提供了充足的转换操作(C string -> Python string, C double -> Python float等),但我找不到一种方法来简单地将c++ float转换为Python float。我知道Python浮点数相当于C/c++的双精度,所以我想我可以将浮点数转换为双精度,然后通过PyFloat_FromDouble()转换为PyObject,但我觉得必须存在更直接的方法来做到这一点。

因为这是一个非常短的函数,很大程度上是一个概念证明,我觉得没有必要花时间学习SWIG或Boost Python或诸如此类的东西;我想用内置的Python/c++ API来做到这一点。任何建议将非常感激!

由于Python float本质上是C double,因此转换必须在某个点发生。引用引用:

Python不支持单精度浮点数;与Python中使用对象的开销相比,使用这些通常是为了节省处理器和内存使用,因此没有理由用两种浮点数使语言复杂化。

因此转换为double(可能只是通过将值传递给接受double的函数),然后您就可以设置了。

正如文本所示,python中的浮点值是对象,这带来了相当大的开销。PyFloat_FromDouble将照顾得到正确的。所以遍历这个函数是正确的。创建列表也是如此。