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<Person>
返回数以百万计的人。
从技术上讲,为函数添加 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() 增加了多少开销?