【问题标题】:Return an array of floats in C++ to Python将 C++ 中的浮点数组返回给 Python
【发布时间】:2014-07-14 20:38:04
【问题描述】:

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

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

首先,您似乎不能使用 Py_BuildValue() 在 C++ 中将任意大小的数组作为 Python 中的列表返回(我不清楚为什么会这样)。一篇旧但仍然相关的帖子here 建议实例化一个 PyList 对象,用数组中的元素填充它,然后返回它。

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

因为这是一个非常短的函数,而且主要是一个概念证明,所以我认为没有必要花时间学习 SWIG 或 Boost Python 之类的东西;我想用内置的 Python/C++ API 来做到这一点。任何建议将不胜感激!

【问题讨论】:

    标签: python c++ extending


    【解决方案1】:

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

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

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

    正如文中所指出的,python 中的浮点值是对象,这会带来相当多的开销。 PyFloat_FromDouble 将负责解决问题。因此,通过该功能是正确的做法。列表创建也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      • 1970-01-01
      • 2015-03-09
      • 2015-05-07
      • 2019-08-24
      • 2011-01-21
      • 1970-01-01
      相关资源
      最近更新 更多