pybind11 包裹的对象的内存开销?

Posted

技术标签:

【中文标题】pybind11 包裹的对象的内存开销?【英文标题】:Memory overhead of objects wrapped by pybind11? 【发布时间】:2019-08-27 11:45:54 【问题描述】:

我想知道使用 pybind11 包装的 C++ 类/结构是否有任何内存开销。 让我们考虑一个简单的例子:

struct Person 
  std::string name;
  int age;


// With some basic bindings
pybind11::class_<Person>(m, "Person")
    .def_readwrite("name", &Person::name)
    .def_readwrite("age", &Person::age);

此外,还有一个 C++ 函数可以通过 std::vector&lt;Person&gt; 返回数以百万计的人。 从技术上讲,为函数添加 pybind11 绑定很容易,但这样做是个好主意吗?

包装函数会返回人员实例的 Python 列表。 通常,在 Python 中,由于内存和 GC 开销,拥有大量微小对象是低效的。 Python 中的典型解决方案是选择列式内存布局,但这些担忧是否也适用于 pybind11 包装的类/结构?

具体来说:如果函数返回 100 万个元素,pybind11 会在内部创建另外 100 万个包装器实例,还是直接在 C++ 对象上进行绑定而不产生任何开销? 成员的类型重要吗?

【问题讨论】:

【参考方案1】:

pybind 文档说它每次在绑定时都会复制结构。这意味着这些结构和容器在 Python 和 C++ 中是独立的,因此 C++ 容器中的数据更改不会反映在 Python 中(无引用)。这也意味着它将在 C++ 和 Python 中复制数据 - C++ 容器中的 100 万个元素和 Python 中的 100 万个元素。

请看这里 - https://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html

【讨论】:

感谢您的澄清,这就是我所害怕的。你有链接到文档中的部分吗?我搜索了类似的东西,但找不到。

以上是关于pybind11 包裹的对象的内存开销?的主要内容,如果未能解决你的问题,请参考以下文章

驱动程序内存、执行程序内存、驱动程序内存开销和执行程序内存开销对作业运行成功的 Apache Spark 影响

python numpy tolist() 增加了多少开销?

Java HashMap 与 ArrayList 相比的内存开销

Android Binder 的内存开销

HTOP 中的 VIRT 列是啥?内存开销?

在 pybind11 中引用 C++ 分配的对象