大纲
- 背景
- 代码入门
- 环境准备
- 头文件
- 业务代码
- 注册
- BOOST_PYTHON_MODULE
- 作用
- boost::python::class_模板类
- 编译
- 运行
- 项目地址
背景
Python语言在大数据、人工智能以及大模型开发中扮演着举足轻重的角色,其影响力不断扩大并深化。
在大数据领域,Python以其简洁易学的语法、高效的计算能力和丰富的库支持,成为处理海量数据的首选工具。它不仅能够帮助开发者进行数据清洗、去重、转换等预处理工作,还具备强大的数据分析能力,能够通过Pandas、NumPy等库实现数据的高效处理和分析。此外,Python在数据可视化方面也有出色的表现,利用Matplotlib、Seaborn等库可以轻松地将复杂的数据以直观、易懂的形式呈现出来,帮助人们更好地理解数据背后的信息。
在人工智能领域,Python同样占据着重要的地位。其灵活性和强大的扩展性使得Python成为实现和优化各种算法和模型的首选语言。从基础的数据挖掘与机器学习,到复杂的深度学习、自然语言处理和计算机视觉,Python都提供了丰富的库和框架支持。例如,Scikit-learn、TensorFlow、Keras等库在机器学习和深度学习领域应用广泛,为研究人员和开发者提供了强大的工具集。Python还支持多种编程语言和平台的集成,如Java、.NET组件或C/C++库,使得在复杂的系统中也可以轻松实现跨语言操作。
在大模型开发中,Python凭借其灵活性和广泛的支持库同样表现出色。大型模型开发通常需要处理大量的数据和复杂的计算任务,Python提供的TensorFlow、PyTorch等深度学习框架提供了丰富的神经网络结构和优化算法,使得开发者可以轻松地构建和训练大型模型。同时,Python社区活跃,不断有新的库和工具被开发出来,为AI研究与应用的发展提供了有力的支持。
Python,作为一门高级、解释型、动态类型的编程语言,以其简洁的语法、丰富的库支持和强大的社区力量,在数据科学、Web开发、自动化脚本等多个领域大放异彩。然而,在追求极致性能、内存管理或需要直接与系统底层交互的场景中,Python可能展现出其局限性。这时,C++作为一门静态类型、编译型语言,以其出色的性能、严格的类型检查以及对底层硬件的直接操作能力,成为了补充Python不足的理想选择。
C++和Python的混合编程可以在以下场景下发挥出优势:
- 性能优化:
对于计算密集型或资源敏感型任务,C++因其高效的执行速度和资源管理能力成为首选。然而,这类任务往往需要复杂的逻辑处理,直接使用C++编程可能会增加开发难度和维护成本。通过Python调用C++编写的关键部分,可以在不牺牲性能的前提下,简化上层逻辑的实现。 - 快速原型开发:
Python以其简洁的语法和丰富的库支持,非常适合快速开发原型和算法验证。当原型验证成功,需要进一步优化性能以满足生产环境需求时,可以将性能瓶颈部分的Python代码替换为C++实现,或者通过Python调用C++库来加速执行。 - 跨语言协作:
在大型项目中,团队成员可能擅长不同的编程语言。Python和C++的混合使用可以充分利用团队中不同成员的技能,促进跨语言协作,提高整体开发效率。 - 利用现有资源:
许多遗留系统或第三方库是用C++编写的,这些资源在性能上经过优化,功能丰富。通过Python调用这些C++代码或库,可以方便地将这些资源集成到新的或现有的Python项目中,避免重复造轮子。 - 系统级编程需求:
对于需要直接与系统硬件交互、进行低级内存管理或实现特定系统功能的场景,C++的底层控制能力不可或缺。而Python的脚本特性则适合作为这些底层功能的封装和调用接口,提供更高层次的抽象和易用性。
下面我们就来讲解,如果进行C++和Python的混合编程。
代码入门
环境准备
我们要安装boost开发库。这是因为后续我们会使用boost.python库来做混合编程。
udo apt-get install libboost-all-dev
头文件
首先我们需要引入boost.python库的头文件
#include <boost/python.hpp>
业务代码
然后像写普通C++类一样写一个类DemoClass 。
这个类的构造函数接受一个int型形参,这点需要和后续代码进行呼应。
其他逻辑就是简单的设置值和返回值操作。
class DemoClass {
public:DemoClass(int value) : value(value) {std::cout << "Constructor: DemoClass created with value " << value << std::endl;}int getValue() const {std::cout << "getValue: Returning value " << value << std::endl;return value;}void setValue(int newValue) {std::cout << "setValue: Setting value to " << newValue << std::endl;value = newValue;}private:int value;
};
注册
BOOST_PYTHON_MODULE(demo_module) {using namespace boost::python;class_<DemoClass>("CplusplusClass", init<int>()).def("get", &DemoClass::getValue).def("set", &DemoClass::setValue);
}
BOOST_PYTHON_MODULE
BOOST_PYTHON_MODULE 是 Boost.Python 库中的一个宏,用于定义一个 Python 模块。这个宏将 C++ 代码中的类和函数导出到 Python,使得它们可以在 Python 中被调用和使用。
作用
- 定义模块:指定模块的名称,这个名称将用于在 Python 中导入模块。
- 导出类和函数:在模块定义中,可以使用 Boost.Python 提供的各种函数将 C++ 类和函数导出到 Python。
boost::python::class_模板类
我们将需要导出的类DemoClass作为boost::python::class_模板类,构造出一个对象。初始化时,第一个参数"CplusplusClass"是我们在Python中使用的类名(对应于C++中的DemoClass);第二个参数和DemoClass的构造函数呼应,即使用一个int型变量进行对象构造。
def方法将C++中的方法映射到Python类中的方法名。如上例,Python中CplusplusClass::get映射到DemoClass::getValue;CplusplusClass::set映射到DemoClass::setValue。
编译
我们使用Cmake来编译这个项目。它将产出一个动态链接库。
需要注意的是最终我们生成的动态链接库名称要和代码中BOOST_PYTHON_MODULE中定义的模块名一致。本例中模块名是demo_module
。
cmake_minimum_required(VERSION 3.12)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED True)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++20 -O3")# 查找 Boost 库
find_package(Boost REQUIRED COMPONENTS python)# 查找 Python 库
find_package(PythonLibs REQUIRED)# 包含 Boost 和 Python 头文件
include_directories(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})# 添加动态链接库文件
add_library(demo_module SHARED main.cpp)# 链接 Boost 和 Python 库
target_link_libraries(demo_module ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})# 设置输出目录
set_target_properties(demo_module PROPERTIES PREFIX "" SUFFIX ".so")
运行
我们需要让python进程可以找到上述编译的动态链接库,则可以在工程目录下执行下面命令
source python_env.sh
python_env.sh的内容如下:
#!/bin/bash# 获取当前目录
CURRENT_DIR=$(pwd)# 设置构建目录路径
BUILD_DIR="$CURRENT_DIR/build"# 将构建目录添加到 PYTHONPATH
export PYTHONPATH=$PYTHONPATH:$BUILD_DIR# 输出当前的 PYTHONPATH
echo "PYTHONPATH is set to: $PYTHONPATH"
这样在当前终端中启动的python就可以找到库了。
项目地址
https://github.com/f304646673/cpulsplus/tree/master/boost_python/p_call_c