Python与C++混合编程完全指南
为什么需要Python与C++结合?
Python和C++混合编程结合了两者的优势,在保持Python开发效率的同时,利用C++实现性能关键部分的加速。
优势 | 说明 |
---|---|
性能提升 | C++执行效率远超Python |
复用现有代码 | 利用已有C++库避免重写 |
系统级访问 | 突破Python在系统编程的限制 |
并行计算 | 更好的多线程/GPU支持 |
内存控制 | 精细管理内存使用 |
基础交互方式
方法对比
方法 | 难度 | 性能 | 适用场景 |
---|---|---|---|
ctypes | 简单 | 中 | 调用简单C函数 |
CFFI | 中等 | 高 | 需要灵活性的场景 |
SWIG | 中等 | 高 | 大型项目,多语言支持 |
pybind11 | 中等 | 高 | 现代C++项目 |
Boost.Python | 复杂 | 高 | 复杂C++项目 |
Cython | 中等 | 高 | 科学计算,已有Python代码 |
ctypes - 调用C函数
C++代码示例
// math_funcs.cpp
extern "C" {
int add(int a, int b) {
return a + b;
}
double multiply(double a, double b) {
return a * b;
}
}
编译为共享库:
g++ -shared -fPIC -o libmath.so math_funcs.cpp
Python调用代码
import ctypes
# 加载共享库
math_lib = ctypes.CDLL('./libmath.so')
# 调用C函数
result = math_lib.add(5, 3)
print(f"5 + 3 = {
result}")
# 指定参数和返回类型
math_lib.multiply.argtypes = [ctypes.c_double, ctypes.c_double]
math_lib.multiply.restype = ctypes.c_double
result = math_lib.multiply(2.5, 4.0)
print(f"2.5 * 4.0 = {
result}")
代码解释:
extern "C"
避免C++名称修饰-shared -fPIC
生成位置无关代码argtypes
和restype
确保类型安全- 适合简单C函数调用
pybind11 - 现代C++绑定
安装pybind11
pip install pybind11
C++模块示例
// example.cpp
#include <pybind11/pybind11.h>
namespace py = pybind11;
int add(int a, int b) {
return a + b;
}
PYBIND11_MODULE(example, m) {
m.doc() = "pybind11示例模块";
m.def("add", &add, "两个整数相加");
}
编译命令:
g++ -O3 -Wall -shared -std=c++11