C++和Python混合编程——Python调用C++入门

背景

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的混合编程可以在以下场景下发挥出优势:

  1. 性能优化
    对于计算密集型或资源敏感型任务,C++因其高效的执行速度和资源管理能力成为首选。然而,这类任务往往需要复杂的逻辑处理,直接使用C++编程可能会增加开发难度和维护成本。通过Python调用C++编写的关键部分,可以在不牺牲性能的前提下,简化上层逻辑的实现。
  2. 快速原型开发
    Python以其简洁的语法和丰富的库支持,非常适合快速开发原型和算法验证。当原型验证成功,需要进一步优化性能以满足生产环境需求时,可以将性能瓶颈部分的Python代码替换为C++实现,或者通过Python调用C++库来加速执行。
  3. 跨语言协作
    在大型项目中,团队成员可能擅长不同的编程语言。Python和C++的混合使用可以充分利用团队中不同成员的技能,促进跨语言协作,提高整体开发效率。
  4. 利用现有资源
    许多遗留系统或第三方库是用C++编写的,这些资源在性能上经过优化,功能丰富。通过Python调用这些C++代码或库,可以方便地将这些资源集成到新的或现有的Python项目中,避免重复造轮子。
  5. 系统级编程需求
    对于需要直接与系统硬件交互、进行低级内存管理或实现特定系统功能的场景,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

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

breaksoftware

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值