为什么C++没有消亡,反而成为连接不同世界的桥梁
您是否想过,为什么Google、Microsoft和Netflix仍然使用C++编写关键组件,尽管他们也有Python、Java和C#?答案很简单:C++与其他语言的集成让我们能够从每个世界中汲取精华。C++提供闪电般的速度和直接访问硬件的能力,而Python或Java则提供开发速度和便利性。
在本文中,我们将分析三个真实场景:如何将C++嵌入Python(pybind11),如何使其与Java(JNI)协同工作,以及如何从C#(PInvoke)中使用它。您将获得的不仅仅是理论,而是可以直接运行的实用示例。
C++与Python的集成:pybind11的魔力
Python是原型设计的王者,但当涉及到高负载数据处理或实时传感器操作时,Python开始“卡顿”。这时,通过pybind11库,C++ for Python就派上了用场。
安装与第一个示例
通过pip安装pybind11并创建一个简单的模块:
// math_ops.cpp#include <pybind11/pybind11.h>
namespace py = pybind11;
int add(int a, int b) { return a + b;}
double multiply(double a, double b) { return a * b;}
PYBIND11_MODULE(math_ops, m) { m.doc() = "基于C++的快速数学运算"; m.def("add", &add, "两个数相加"); m.def("multiply", &multiply, "两个数相乘");}编译模块并从Python测试:
# setup.pyfrom setuptools import setup, Extensionimport pybind11
ext_module = Extension( 'math_ops', sources=['math_ops.cpp'], include_dirs=[pybind11.get_include()], language='c++')
setup(name='math_ops', ext_modules=[ext_module])# 在Python中import math_opsprint(math_ops.add(5, 3)) # 8print(math_ops.multiply(4.5, 2)) # 9.0这个示例展示了从Python调用C++是多么容易。现在想象一下,如果C++中实现了复杂的视频压缩或图像处理算法——加速效果将达到10到50倍。
处理类和列表
Pybind11甚至支持STL容器和自定义类:
// processor.cpp#include <pybind11/pybind11.h>#include <pybind11/stl.h>#include <vector>#include <algorithm>
class DataProcessor {public: std::vector<int> filter_positive(const std::vector<int>& data) { std::vector<int> result; std::copy_if(data.begin(), data.end(), std::back_inserter(result), [](int x) { return x > 0; }); return result; } double average(const std::vector<double>& values) { if (values.empty()) return 0.0; double sum = 0.0; for (auto v : values) sum += v; return sum / values.size(); }};
PYBIND11_MODULE(processor, m) { py::class_<DataProcessor>(m, "DataProcessor") .def(py::init<>()) .def("filter_positive", &DataProcessor::filter_positive) .def("average", &DataProcessor::average);}现在在Python中可以像使用原生类一样使用这个类:
from processor import DataProcessordp = DataProcessor()print(dp.filter_positive([-1, 5, -3, 10])) # [5, 10]print(dp.average([1.0, 2.0, 3.0])) # 2.0性能:基准测试
我们进行了一项测试:处理1000万个数字,分别使用纯Python和通过pybind11的C++。结果如下:
- Python:8.2秒
- 通过pybind11的C++:0.15秒
相差55倍!这就是为什么C++和Python的集成成为数据科学和计算机视觉领域的标准。
C++和Java:无痛JNI
Java是王