我正在尝试使用 pybind11 在 C++ 中构建一个 python 模块。我有以下代码:
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <pybind11/numpy.h>
namespace py = pybind11;
struct ContainerElement
{
uint8_t i;
double d;
double d2;
};
class Container
{
private:
std::vector<uint8_t> ints;
std::vector<double> doubles;
std::vector<double> doubles2;
public:
std::vector<uint8_t>& getInts() { return ints; }
std::vector<double>& getDoubles() { return doubles; }
std::vector<double>& getDoubles2() { return doubles2; }
void addElement(ContainerElement element)
{
ints.emplace_back(element.i);
doubles.emplace_back(element.d);
doubles2.emplace_back(element.d2);
}
};
void fillContainer(Container& container)
{
for (int i = 0; i < 1e6; ++i)
{
container.addElement({(uint8_t)i, (double)i,(double)i });
}
}
PYBIND11_MODULE(containerInterface, m) {
py::class_<Container>(m, "Container")
.def(py::init<>())
.def("getInts", [](Container& container)
{
return py::array_t<uint8_t>(
{ container.getInts().size() },
{ sizeof(uint8_t) },
container.getInts().data());
})
.def("getDoubles", [](Container& container)
{
return py::array_t<double>(
{ container.getDoubles().size() },
{ sizeof(double) },
container.getDoubles().data());
})
这可行,但是当我检查程序的内存使用情况(使用psutil.Process(os.getpid()).memory_info().rss)时,当我调用函数getInts, getDoubles和getDoubles2. 有没有办法避免这种情况?
我尝试过使用np.array(container.getInts(), copy=False),但它仍然会复制。我还尝试使用py::buffer_protocol()此处提到的 Container 类:https ://pybind11.readthedocs.io/en/stable/advanced/pycpp/numpy.html 。但是,我只能对 Ints 向量或 Doubles 向量进行此操作,而不能同时对所有向量进行操作。
然后我可以使用i = np.array(container, copy=False),而无需制作副本。但是,正如我所说,它现在仅适用于Ints矢量。
胡说叔叔
慕的地8271018
月关宝盒
相关分类