我正在使用pybind11将一个用c++编写的库导出为python模块。我的情况可能有点不寻常,因为c++库已经包含了我想要导出的类的所有元数据的结构。我正在考虑是否可以利用这些现有的元数据,而不是重新输入所有这些元数据来创建pybind11绑定。
正常的pybind11代码可能如下所示;
namespace py = pybind11;
PYBIND11_MODULE(pet, m) {
py::class_<Pet>(m,"Pet")
.def("feed", &Pet::feed, "Feed the pet")
.def("walk", &Pet::walk, "Walk the pet");
}我正在考虑沿着这些思路做一些事情;
namespace py = pybind11;
PYBIND11_MODULE(pet, m) {
py::class_<Pet> pet(m,"Pet");
for (int i = 0; i < pet_metadata.num_funcs; i++)
{
auto& md = pet_metadata.func[i];
pet.def(md.name, md.fptr, md.descr);
}
}做这样的事情有没有性能上的影响?我对pybind11在幕后是如何工作的没有很好的理解。每次从python调用一个绑定函数时,for循环都会运行吗?或者它们都是在编译时计算的?这种方法会奏效吗?
发布于 2020-10-30 22:19:11
如果深入研究这些宏,您会发现PYBIND11_MODULE扩展到了一些代码,这些代码是从Python库加载时计算出来的。对于其余部分,您的代码看起来应该可以工作。
https://stackoverflow.com/questions/64609976
复制相似问题