C++比Python快50倍?如何让C++和Python优势互补?(Boost Python)_boost python vscode

文末有福利领取哦~

👉一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。img

👉二、Python必备开发工具

img
👉三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
img

👉 四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
img

👉五、Python练习题

检查学习结果。
img

👉六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
img

img

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 支持Python、Java、Ruby等语言调用C接口
  • 文档全面,易于学习
  • 绑定性能欠佳, 不支持属性和内部类封装
  • C++支持不好

2.2 Boost::Python

  • 支持Python2与Python3调用C++接口
  • 大量使用C++ templates,明显提高编译时间
  • 非常可靠、稳定、经过充分测试
  • 语法较复杂,且文档不详细

在这里插入图片描述

本文采用Boost::Python进行C++/Python联合编程。

2.3 ctypes

  • 灵活,完全兼容C语言
  • 使用较繁琐且不支持C++特性

3 Boost::Python安装

打开参考中的官方下载地址,根据不同的操作系统平台下载boost,UNIX和Windows的安装流程差不多,下面以Windows系统为例说明安装过程。

在这里插入图片描述
按下面步骤安装编译Boost::Python

  • 下载最新的boost_1_79_0.zip并解压到本地目录
  • 运行bootstrap.bat在目录下产生b2.exe可执行文件
  • 进入根目录新建user-config.jam用户配置文件,存放本地C++/Python信息
using msvc : 14.2;
using python : 3.7.5
	: "D:/Anaconda/Anaconda/envs/test/python.exe"
	: "D:/Anaconda/Anaconda/envs/test/include"
	: "D:/Anaconda/Anaconda/envs/test/libs";

其中msvcVisual Studio对应的msvc toolset版本,具体对应关系如下:在这里插入图片描述
python则定义了本地使用的python解释器相关路径和库

  • 命令行执行自动化安装:
b2 --with-python install --prefix="D:/3rdLib/boost/boost\_1\_79\_0/bin/lib64-msvc-14.2" toolset=msvc-14.2 link=static address-model=64 --user-config=user-config.jam

其中一些关键参数解释如下:

  • with- | without-:前者后接要编译的Boost库名,如本文中只需编译Boost下的Python库;后者即为编译除之外的所有库,缺省则为全部编译
  • stage | install:前者表示只生成库文件(.dll与.lib),后者会额外生成include目录包含库文件对应的头文件,推荐使用stage,因为安装完成后根目录下的boost与include目录文件完全一致,可直接作为头文件使用,节省编译时间
  • stagedir | prefix:表示编译生成文件的路径,前者对应stage安装模式,后者对应install安装模式。建议在根目录下新建bin目录管理生成的库文件
# VS2019编译的x86库文件
bin/lib32-msvc-14.2 
# VS2019编译的x64库文件
bin/lib64-msvc-14.2

  • toolset:表示编译器,可选gccmsvc-14.2(VS2019)等
  • link:指定生成动态链接库shared还是静态链接库static,推荐使用静态库方式编译,这样发布程序时无需连带发布Boost的.dll文件,本文采用静态编译。
    在这里插入图片描述
    在这里插入图片描述
  • address-model:指定编译版本,可选32 | 64,该参数必须和本地安装的Python位数相对应,否则会编译出错
  • user-config:使用的本地用户配置文件路径

补充一下编译库文件的命名格式:

libboost_python37-vc142-mt-gd-x64-1_79
| ||   | |      | |   | || ||| | | |  |
 -  ---   ------   ---  -- - -  -   --
 1   2       3      4    5 6 7  8    9

  1. 静态库以lib开头,动态库没有lib前缀
  2. boost::python库名称和版本
  3. 编译器名称及版本
  4. mt代表threading=multi,没有则代表threading=single
  5. s代表runtime-link=static,没有则代表runtime-link=shared
  6. gd代表debug版本,没有则代表release版本
  7. x32代表32 位程序,x64代表64 位
  8. Boost库版本,1_79代表Boost 1.79版本。

4 测试实例:python继承C++接口

新建工程文件夹,包含三个文件helloworld.cpphelloworld.pyCMakeLists.txt

helloworld.cpp中编写:

// 因为采用静态编译boost库,因此必须定义此宏,否则编译出错
#define BOOST\_PYTHON\_STATIC\_LIB

#include<boost/python.hpp>
#include<boost/python/wrapper.hpp>
#include<string>
#include<iostream>

using namespace boost::python;
using namespace std;

struct Base
{
    virtual ~Base() {}
    virtual int f() { return 0; };
};

struct BaseWrap : Base, wrapper<Base>
{
    int f()
    {
        if (override f = this->get\_override("f"))
            return f(); //如果函数进行重载了,则返回重载
        return Base::f(); //否则返回基类
    }
    int default\_f() { return this->Base::f(); }
};

BOOST\_PYTHON\_MODULE(hello)
{
    class_<BaseWrap, boost::noncopyable>("Base")
        .def("f", &Base::f, &BaseWrap::default_f);
}

CMakeLists.txt中编写编译规则

project(Boost_Test)
cmake_minimum_required(VERSION 2.8.3)

if(MSVC)
    # set(Boost_USE_STATIC_LIBS ON)
    set(Boost_DIR D:/3rdLib/boost/boost_1_79_0/stage/lib/cmake/Boost-1.79.0)
    set(PYTHON_INCLUDE_DIRS D:/Anaconda/Anaconda/envs/test/include)
    set(PYTHON_LIBRARIES D:/Anaconda/Anaconda/envs/test/libs/python37.lib)
    find_package(Boost 1.79.0 CONFIG COMPONENTS python REQUIRED)
    include_directories(${Boost_INCLUDE_DIR} ${PYTHON_INCLUDE_DIRS})
endif(MSVC)

set(MODULE_NAME hello)
add_library(${MODULE_NAME} SHARED
    helloword.cpp
	)

if (UNIX)
  set_target_properties(${MODULE_NAME}
    PROPERTIES
    PREFIX ""
  )
elseif (WIN32)
  set_target_properties(${MODULE_NAME}
  PROPERTIES
  SUFFIX ".pyd"
  )
endif()

target_link_libraries(${MODULE_NAME}
  ${Boost_LIBRARIES}
  ${PYTHON_LIBRARIES}
)

在工程目录下执行以下命令行:

mkdir build
cd build
cmake ..
make

即可编译出hello.pyd二进制文件,将该文件置于工程目录下(与helloworld.py在同一个目录),在helloworld.py中导入接口,测试多态:

import hello 
base = hello.Base()
# 定义派生类,继承C++类
class Derived(hello.Base):
    def f(self):
        return 42

derived = Derived()
print( base.f())
print (derived.f())

输出以下内容,证明实验成功

>>> 0
>>> 42

5 常见问题

#include <boost\python.hpp>无法打开源文件'pyconfig.h'

解决方案:首先确保当前虚拟环境下有pyconfig,否则需要pip install。接着对于vscode,在c_cpp_properties.json中添加python的include目录
2. >

error LNK2019: 无法解析的外部符号 "__declspec(dllimport) class boost::python::xxx

最后

不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~

给大家准备的学习资料包括但不限于:

Python 环境、pycharm编辑器/永久激活/翻译插件

python 零基础视频教程

Python 界面开发实战教程

Python 爬虫实战教程

Python 数据分析实战教程

python 游戏开发实战教程

Python 电子书100本

Python 学习路线规划

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值