python使用Pybind11扩展c++

Pybind11 是一个轻量级的C++ 库,旨在无缝地将C++代码绑定到Python。它简化了C++ 函数、类和数据结构在Python中使用的过程,使得开发人员可以方便地在Python中调用C++ 代码,同时保留两者的性能优势下面将详细介绍Pybind11的基本概念、安装方法、用法以及示例代码。

Pybind11的基本概念

Pybind11允许C++函数、类和其他对象暴露给Python,使得它们可以在Python中被直接调用。主要功能包括:

  • 暴露C++函数和类给Python。
  • 支持C++的STL容器和数据结构在Python中的使用。
  • 支持C++的异常传递到Python。
  • 允许使用Python对象和函数在C++中。

Pybind11 的优点

  • 兼容性强,支持 Python2.7、Python3.x、PyPy (PyPy2.7 >= 5.7);
  • 可以在 C++ 中使用 lambda 表达式,并在 Python 中使用捕获的变量;
  • 大量使用移动特性,保证数据转移时的性能;
  • 可以很方便地通过 Python buffer protocol 进行数据类型的转移;
  • 可以很方便地对函数进行向量化加速;
  • 支持使用 Python 的切片语法;
  • Pybind11 是 header-only 的,只需要包含头文件即可;
  • 相比于 Boost::Python,生成的二进制文件体积更小;
  • 函数签名通过 constexper 提前计算,进一步减小二进制文件体积;
  • C++ 中的类型可以很容易地进行序列化/反序列化;

Python 以其灵活和易于上手的特点,成为了当下炙手可热的编程语言。然而,动态解释型语言的特点限制了其性能。因此在需要性能的地方,往往使用 C、C++ 等传统高性能语言实现(如 numpy 这种科学计算库),并在 Python 中调用。这就是所谓的混合编程,发挥各自的优势,取长补短。

Pybind11出来以前,Python和C/C++混合编程

Python 的 C-API (Python.h)
SWIG
Python 的 ctypes 模块
Cython
Boost::Python

安装Pybind11

Pybind11可以通过pip轻松安装:

pip install pybind11

或者可以从源码安装:

git clone https://github.com/pybind/pybind11.git
cd pybind11
mkdir build
cd build
cmake ..
make install

用法示例

1. 暴露简单的C++函数

首先,创建一个简单的C++函数,然后使用Pybind11将其暴露给Python。

C++代码(example.cpp)

#include <pybind11/pybind11.h>// 简单的C++函数
int add(int i, int j) {return i + j;
}// Pybind11模块定义
PYBIND11_MODULE(example, m) {m.def("add", &add, "A function which adds two numbers");
}

编译上面的代码:

c++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) example.cpp -o example$(python3-config --extension-suffix)

然后在Python中使用:

import example
print(example.add(2, 3))  # 输出: 5
2. 暴露C++类

Pybind11还可以暴露C++类,并在Python中创建和操作这些类的实例。

C++代码(example.cpp)

#include <pybind11/pybind11.h>class Pet {
public:Pet(const std::string &name) : name(name) {}void setName(const std::string &name_) { name = name_; }std::string getName() const { return name; }
private:std::string name;
}PYBIND11_MODULE(example, m) {pybind11::class_<Pet>(m, "Pet").def(pybind11::init<const std::string &>()).def("setName", &Pet::setName).def("getName", &Pet::getName);
}

编译代码:

c++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) example.cpp -o example$(python3-config --extension-suffix)

在Python中使用:

import example
p = example.Pet("Mittens")
print(p.getName())  # 输出: Mittens
p.setName("Whiskers")
print(p.getName())  # 输出: Whiskers

更多功能

暴露STL容器

Pybind11可以将C++的STL容器(如std::vectorstd::map等)暴露给Python。

C++代码(example.cpp)

#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <vector>std::vector<int> get_vector() {return {1, 2, 3, 4, 5};
}PYBIND11_MODULE(example, m) {m.def("get_vector", &get_vector);
}

编译代码:

c++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) example.cpp -o example$(python3-config --extension-suffix)

在Python中使用:

import example
print(example.get_vector())  # 输出: [1, 2, 3, 4, 5]
异常处理

Pybind11支持将C++中的异常传递到Python,并在Python中进行处理。

C++代码(example.cpp)

#include <pybind11/pybind11.h>void throws_exception() {throw std::runtime_error("An error occurred!");
}PYBIND11_MODULE(example, m) {m.def("throws_exception", &throws_exception);
}

编译代码:

c++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) example.cpp -o example$(python3-config --extension-suffix)

在Python中使用:

import exampletry:example.throws_exception()
except RuntimeError as e:print(e)  # 输出: An error occurred!

总结

Pybind11是一个强大且易于使用的工具,允许开发人员将C++ 代码无缝地集成到Python项目中。通过Pybind11,可以高效地暴露C++ 函数、类和数据结构,并在Python中进行调用和操作。其支持STL容器、异常处理等特性,使得它在C++ 与Python交互中表现得非常出色。使用Pybind11,可以充分利用C++的性能优势,同时享受Python的开发便利性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/36032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《梦醒蝶飞:释放Excel函数与公式的力量》6.2 TIME函数

6.2 TIME函数 1&#xff09; TIME函数概述 TIME函数是Excel中用于根据指定的小时、分钟和秒返回时间值的内置函数。这个时间值是一个从0&#xff08;12:00 AM&#xff09;开始的序列数&#xff0c;其中一天的每个小时等于1/24&#xff0c;每分钟等于1/(24*60)&#xff0c;每秒…

MySQL中的TRUNCATE命令是否直接删除文件

1. TRUNCATE命令的基本原理 命令格式&#xff1a;TRUNCATE TABLE table_name;功能&#xff1a;TRUNCATE命令用于删除表中的所有数据&#xff0c;但保留表结构和定义&#xff08;如列、索引、约束等&#xff09;。 2. TRUNCATE命令的实现机制 数据删除&#xff1a;TRUNCATE命…

【系统架构设计师】六、信息系统基础知识(电子政务|企业信息化|电子商务|信息化战略体系)

目录 一、电子政务EG 1.1 电子政务的内容 1.2 电子政务的主要特征 二、企业信息化EI 2.1 企业信息化实现 2.2 企业信息化方法 三、电子商务EC 四、信息化战略体系 五、客户关系CRM 5.1 CRM的功能 5.2 CRM解决方案具备的要素 5.3 CRM的实现过程 六、供应链管理SCM 七…

tensorflow神经网络

训练一个图像识别模型&#xff0c;使用TensorFlow&#xff0c;需要以下步骤。 1. 安装所需的库 首先&#xff0c;确保安装了TensorFlow和其他所需的库。 pip install tensorflow numpy matplotlib2. 数据准备 需要收集和准备训练数据。每个类别应有足够多的样本图像。假设有…

Flutter TIM 项目实现

目录 1. 服务端API 1.1 生成签名 1.1.1 步骤 第一步:获取签名算法 第二步:查看函数输入输出 第三步:nodejs 实现功能 1.1.2 验证签名 小结 1.2 Rest API 调用 1.2.1 签名介绍 1.2.2 腾讯接口 生成管理员 administrator 签名 包装一个 post 请求函数 查询账号 …

2734. 执行子串操作后的字典序最小字符串(Rust单百算法)

题目 给你一个仅由小写英文字母组成的字符串 s 。在一步操作中&#xff0c;你可以完成以下行为&#xff1a; 选择 s 的任一非空子字符串&#xff0c;可能是整个字符串&#xff0c;接着将字符串中的每一个字符替换为英文字母表中的前一个字符。例如&#xff0c;‘b’ 用 ‘a’…

人机融合的分布式

分布式系统是指通过多个互相连接但独立运行的节点共同完成任务的计算架构。分布式系统的拓展与生长是指通过增加更多独立节点来提升系统整体性能和容量&#xff0c;同时保持各节点间的协调与协作。 人机融合的分布式系统是一种强调人类和机器之间协同工作的计算架构&#xff0c…

001 线性查找(lua)

文章目录 迭代器主程序 迭代器 -- 定义一个名为 linearSearch 的函数&#xff0c;它接受两个参数&#xff1a;data&#xff08;一个数组&#xff09;和 target&#xff08;一个目标值&#xff09; function linearSearch(data, target) -- 使用 for 循环遍历数组 data&…

【高考志愿】通信工程

目录 一、专业概述 二、主要研究领域 三、就业前景与方向 四、专业难度与学习挑战 五、国内知名高校推荐 高考志愿选择通信工程专业是一个深思熟虑后极具前瞻性的决策&#xff0c;这一专业不仅拥有广泛的就业前景和深厚的学科基础&#xff0c;而且能够为学生提供丰富的知识…

反向代理服务器和正向代理服务器的介绍与区别

反向代理服务器之所以被称为“反向代理”&#xff0c;是因为它与传统的“正向代理”&#xff08;或前向代理&#xff09;服务器相对应。为了更好地理解这个概念&#xff0c;需要了解正向代理和反向代理的区别。 反向代理服务器和正向代理服务器的介绍与区别 一、正向代理服务器…

华为OD机试 - 石头剪刀布游戏(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

酷开科技丨酷开系统大屏购物 打造沉浸式购物体验

在这个信息化的时代&#xff0c;购物已经不仅仅局限于传统的线下店铺&#xff0c;线上购物逐渐成为了我们生活中重要的一部分。而大屏购物作为线上购物的一种形式&#xff0c;更是凭借其独特的优势和实用的技巧&#xff0c;成为了消费者们的新宠。随着科技的进步和消费者需求的…

如何在Java中实现安全编码

如何在Java中实现安全编码 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在当今数字化和网络化的时代&#xff0c;安全编码成为软件开发中至关重要的一环。特…

vue3中使用keepalive和component

vue3和vue2中有些差异&#xff0c;直接上代码&#xff1a; <KeepAlive include"aComponent"><component :iscompList[active]goDetail"goDetail"back"back" /></KeepAlive> <script setup lang"ts"> /*** 将…

lumbda常用操作

文章目录 lumbda的常用操作将List<String>转List<Integer>filter 过滤max 和min将List<Object>转为Map将List<Object>转为Map&#xff08;重复key&#xff09;将List<Object>转为Map&#xff08;指定Map类型&#xff09; lumbda的常用操作 将Li…

解释一下泛型擦除的概念,并讨论它对 Java 类型系统的影响

泛型是Java语言中一个非常重要的特性&#xff0c;它允许你在类、接口和方法中使用类型参数&#xff0c;从而使得代码更加通用、灵活和类型安全。 然而&#xff0c;在Java中&#xff0c;泛型的实现方式有一个特殊之处&#xff0c;被称为“类型擦除”&#xff08;Type Erasure&a…

读AI新生:破解人机共存密码笔记13有益机器

1. 标准模型 1.1. 我们能控制一个从外太空来的超级智能实体的概率几乎为零 1.2. 随着根据标准模型设计的机器变得更加智能&#xff0c;以及它们的行动范围遍及全球&#xff0c;关闭机器这种方法越来越不可行 1.2.1. 机器将会追求它们自己的目标&#xff0c;无论目标错得多么…

软件开发公司如何招开发工程师?

过去几年,各大公司的数字化举措都翻了一番。到 2026 年,全球数字化转型支出预计 将达到 3.4 万亿美元。 疫情引发的危机、激烈的竞争以及未知的消费者行为模式都让企业陷入困境。为了应对不断变化的形势,企业纷纷转向技术。 其中,移动应用是数字化的领军者之一。2022 年,…

《大道平渊》· 拾伍 —— 为什么做生意的人都欲望比较充足?

《大道平渊》 拾伍 " 欲壑难填&#xff0c;勇往直前。" 为什么做生意的人都欲望比较充足&#xff1f;因为没有人给他们发工资。 在自由市场上&#xff0c;对手渠道、组织运行效率、商业化…… 随时一波小浪&#xff0c;都能把你干下场。 . 我们毕竟不是真正的 食…

eNSP中DHCP的相关命令和配置

一、拓扑图 1.新建拓扑图 2.设置PC端 双击PC1&#xff0c;在基础配置下&#xff0c;将IPv4配置选择”DHCP“&#xff0c;点击“应用”。 PC2、PC3、PC4同样操作。 二、DHCP配置 1.g0/0/0口的配置 在AR1上的命令配置如下&#xff1a; <Huawei>system-view [Huawei]…