在C++中将浮点数组返回给Python
我觉得我可能没有找到正确的信息来源,因为关于这个话题的信息实在太难找了。
我在C++中写了一个小函数,Python会调用它,这个函数会创建一个小的浮点数组并把它返回给Python。
首先,似乎你不能用Py_BuildValue()来返回一个任意大小的数组作为Python中的列表(我不太明白为什么会这样)。有一篇旧的但仍然相关的帖子在这里建议创建一个PyList对象,把数组中的元素放进去,然后再返回这个对象。
这个方法是可以的。不过,我的数字是C++风格的浮点数。虽然Python库提供了很多转换操作(比如C字符串转Python字符串,C双精度浮点数转Python浮点数等等),但我找不到简单的方法把C++的浮点数转换成Python的浮点数。我知道Python的浮点数和C/C++的双精度浮点数是等价的,所以我想我可以把浮点数转换成双精度浮点数,然后通过PyFloat_FromDouble()转换成PyObject,但我觉得应该有更直接的方法。
因为这个函数非常短,而且主要是个概念验证,我觉得没有必要花时间去学习SWIG或Boost Python之类的东西;我想用内置的Python/C++ API来完成这个。任何建议都非常感谢!
1 个回答
因为Python中的float
实际上就是C语言中的double
,所以在某个时刻必须进行转换。引用一下官方文档:
Python不支持单精度浮点数;通常使用单精度浮点数是为了节省处理器和内存的使用,但在Python中使用对象的开销远远超过这些节省,所以没有必要让语言变得复杂,去支持两种浮点数。
所以你只需要转换成double
(可能只需将值传递给一个接受double
的函数),这样就可以了。
正如上面提到的,Python中的浮点值是对象,这会带来一些额外的开销。PyFloat_FromDouble
这个函数会处理好这些问题。所以使用这个函数是正确的做法。创建列表时也是一样的道理。