目前有 Pybind11 / Boost.Python / SWIG 这几个主流高效绑定方案的对比和推荐:
🔥 高效 C++ 到 Python 绑定工具推荐
工具 | 性能特点 | 编译速度 | 二进制大小 | 运行效率 | 易用性 | 是否推荐 |
---|---|---|---|---|---|---|
nanobind | 极速绑定库 | ✅ 快 | ✅ 小 | ✅ 高 | ⚠️ 中等 | ✅ 推荐 |
cppyy | JIT + Cling | ⚠️ 动态绑定 | ⚠️ 无编译 | ⚠️ 略慢 | ✅ 高 | ✅ 原型开发推荐 |
litgen | 自动化绑定生成器 | ⚠️ 依赖 srcML | ✅ 自动生成 | ✅ 中等 | ✅ 高 | ✅ 自动生成推荐 |
Cython (C++ 模式) | 混合语言 | ⚠️ 较慢 | ⚠️ 大 | ✅ 高 | ⚠️ 中等 | ⚠️ 一般 |
SWIG | 跨语言绑定 | ⚠️ 较慢 | ⚠️ 大 | ⚠️ 中等 | ⚠️ 低 | ⚠️ 不推荐 |
Boost.Python | 古老经典 | ❌ 很慢 | ❌ 很大 | ⚠️ 低 | ⚠️ 低 | ❌ 不推荐 |
🚀 推荐首选:nanobind
✅ 优势总结:
- 编译速度快:比 Pybind11 快 4x
- 二进制小:比 Pybind11 小 5x
- 运行效率高:比 Pybind11 快 10x
- 零依赖:仅需 Python 和 C++17 编译器
- 支持 STL 容器:vector、map、tuple 等
- 支持 NumPy 数组:nb::ndarray
- 支持类型标注:.pyi 文件生成(stubgen)
🧩 示例代码:
cpp
#include <nanobind/nanobind.h>
struct Dog {
std::string name;
void bark() { printf("%s barks!\n", name.c_str()); }
};
NB_MODULE(example, m) {
nb::class_<Dog>(m, "Dog")
.def(nb::init<>())
.def_rw("name", &Dog::name)
.def("bark", &Dog::bark);
}
🛠 构建方式:
bash
mkdir build && cd build
cmake ..
make
🧪 替代选择:cppyy
✅ 优势总结:
- 无需编译绑定代码
- 动态加载 C++ 头文件
- 适合快速原型开发
- 支持 PyPy
🧩 示例代码(Python):
python
import cppyy
cppyy.include("dog.h")
d = cppyy.gbl.Dog()
d.name = "Buddy"
d.bark()
⚠️ 注意事项:
- 使用 Cling/LLVM,部署环境需要安装额外依赖
- 对模板支持良好,但运行时性能略低于 nanobind
- 不适合生产环境中的静态绑定
🧱 自动绑定生成:litgen
✅ 优势总结:
- 自动从 C++ 头文件生成 Python 绑定
- 支持 Pybind11 和 nanobind
- 文档自动生成(docstring)
- 基于 srcML 解析器
🧩 示例流程:
- 写一个 C++ 函数:
cpp
// math.h
int square(int x);
- 使用 litgen 生成绑定代码:
bash
litgen -i math.h -o bindings.cpp --pybind11 false --nanobind true
- 编译并导入:
bash
g++ -shared -fPIC bindings.cpp -o _math.so
- Python 中使用:
python
import math
print(math.square(4)) # 输出 16
📦 总结:根据你的需求选工具
场景 | 推荐工具 | 说明 |
---|---|---|
高性能嵌入式项目 | nanobind |
最佳选择,轻量高效 |
快速原型开发 | cppyy |
零编译,动态调用 |
大量结构体自动绑定 | litgen + nanobind |
自动生成绑定代码 |
跨语言调用 | SWIG |
支持多语言,但性能一般 |
旧项目维护 | Pybind11 |
社区活跃,文档丰富 |
Windows/.NET 项目 | C++/CLI + Python.NET |
仅限 Windows 平台 |
✅ 如果你正在做 CTP 接口绑定
建议采用以下组合:
工具 | 用途 |
---|---|
nanobind |
主体绑定(结构体、函数) |
litgen |
自动提取结构体字段生成 .cpp 绑定代码 |
stubgen |
生成 .pyi 类型存根,提升 IDE 支持 |