pybind11 中的编程绑定
Programmatic bindings in pybind11
我正在使用 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 循环是否会 运行?还是全部在编译时进行评估?这种方法是否有效?
如果您仔细研究这些宏,您会发现 PYBIND11_MODULE
扩展为一段代码,当您的库从 Python 加载时会计算这些代码。对于其余部分,您的代码看起来应该可以工作。
我正在使用 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 循环是否会 运行?还是全部在编译时进行评估?这种方法是否有效?
如果您仔细研究这些宏,您会发现 PYBIND11_MODULE
扩展为一段代码,当您的库从 Python 加载时会计算这些代码。对于其余部分,您的代码看起来应该可以工作。