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

时间:2019-08-27 11:45:54

标签: python c++ pybind11

我想知道使用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<Person>返回数以百万计的人。 从技术上讲,为该函数添加pybind11绑定很容易,但是这样做是个好主意吗?

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

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

1 个答案:

答案 0 :(得分:2)

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

查看此处-https://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html