欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python使用Pybind11擴(kuò)展c++的實(shí)現(xiàn)

 更新時(shí)間:2025年04月30日 09:22:02   作者:Tech?Embedded  
Pybind11是一個(gè)輕量級(jí)的C++庫,旨在無縫地將C++代碼綁定到Python,本文主要介紹了python使用Pybind11擴(kuò)展c++的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下

Pybind11 是一個(gè)輕量級(jí)的C++ 庫,旨在無縫地將C++代碼綁定到Python。它簡(jiǎn)化了C++ 函數(shù)、類和數(shù)據(jù)結(jié)構(gòu)在Python中使用的過程,使得開發(fā)人員可以方便地在Python中調(diào)用C++ 代碼,同時(shí)保留兩者的性能優(yōu)勢(shì)下面將詳細(xì)介紹Pybind11的基本概念、安裝方法、用法以及示例代碼。

Pybind11的基本概念

Pybind11允許C++函數(shù)、類和其他對(duì)象暴露給Python,使得它們可以在Python中被直接調(diào)用。主要功能包括:

  • 暴露C++函數(shù)和類給Python。
  • 支持C++的STL容器和數(shù)據(jù)結(jié)構(gòu)在Python中的使用。
  • 支持C++的異常傳遞到Python。
  • 允許使用Python對(duì)象和函數(shù)在C++中。

Pybind11 的優(yōu)點(diǎn)

  • 兼容性強(qiáng),支持 Python2.7、Python3.x、PyPy (PyPy2.7 >= 5.7);
  • 可以在 C++ 中使用 lambda 表達(dá)式,并在 Python 中使用捕獲的變量;
  • 大量使用移動(dòng)特性,保證數(shù)據(jù)轉(zhuǎn)移時(shí)的性能;
  • 可以很方便地通過 Python buffer protocol 進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)移;
  • 可以很方便地對(duì)函數(shù)進(jìn)行向量化加速;
  • 支持使用 Python 的切片語法;
  • Pybind11 是 header-only 的,只需要包含頭文件即可;
  • 相比于 Boost::Python,生成的二進(jìn)制文件體積更小;
  • 函數(shù)簽名通過 constexper 提前計(jì)算,進(jìn)一步減小二進(jìn)制文件體積;
  • C++ 中的類型可以很容易地進(jìn)行序列化/反序列化;

Python 以其靈活和易于上手的特點(diǎn),成為了當(dāng)下炙手可熱的編程語言。然而,動(dòng)態(tài)解釋型語言的特點(diǎn)限制了其性能。因此在需要性能的地方,往往使用 C、C++ 等傳統(tǒng)高性能語言實(shí)現(xiàn)(如 numpy 這種科學(xué)計(jì)算庫),并在 Python 中調(diào)用。這就是所謂的混合編程,發(fā)揮各自的優(yōu)勢(shì),取長(zhǎng)補(bǔ)短。

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. 暴露簡(jiǎn)單的C++函數(shù)

首先,創(chuàng)建一個(gè)簡(jiǎn)單的C++函數(shù),然后使用Pybind11將其暴露給Python。

C++代碼(example.cpp)

#include <pybind11/pybind11.h>

// 簡(jiǎn)單的C++函數(shù)
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中創(chuàng)建和操作這些類的實(shí)例。

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::vector、std::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中進(jìn)行處理。

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 example

try:
    example.throws_exception()
except RuntimeError as e:
    print(e)  # 輸出: An error occurred!

總結(jié)

Pybind11是一個(gè)強(qiáng)大且易于使用的工具,允許開發(fā)人員將C++ 代碼無縫地集成到Python項(xiàng)目中。通過Pybind11,可以高效地暴露C++ 函數(shù)、類和數(shù)據(jù)結(jié)構(gòu),并在Python中進(jìn)行調(diào)用和操作。其支持STL容器、異常處理等特性,使得它在C++ 與Python交互中表現(xiàn)得非常出色。使用Pybind11,可以充分利用C++的性能優(yōu)勢(shì),同時(shí)享受Python的開發(fā)便利性。

到此這篇關(guān)于python使用Pybind11擴(kuò)展c++的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Pybind11擴(kuò)展c++內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PyTorch手寫數(shù)字?jǐn)?shù)據(jù)集進(jìn)行多分類

    PyTorch手寫數(shù)字?jǐn)?shù)據(jù)集進(jìn)行多分類

    這篇文章主要介紹了PyTorch手寫數(shù)字?jǐn)?shù)據(jù)集進(jìn)行多分類,損失函數(shù)采用交叉熵,激活函數(shù)采用ReLU,優(yōu)化器采用帶有動(dòng)量的mini-batchSGD算法,需要的朋友可以參考一下
    2022-03-03
  • Django框架中的對(duì)象列表視圖使用示例

    Django框架中的對(duì)象列表視圖使用示例

    這篇文章主要介紹了Django框架中的對(duì)象列表視圖使用示例,Django是重多Python人氣web框架中最為著名的一個(gè),需要的朋友可以參考下
    2015-07-07
  • 如何使用python的pillow庫生成圖像驗(yàn)證碼

    如何使用python的pillow庫生成圖像驗(yàn)證碼

    Pillow庫是一個(gè)強(qiáng)大的Python圖像處理庫,用于生成圖像驗(yàn)證碼,通過初始化圖像大小、驗(yàn)證碼字符長(zhǎng)度和字體大小,生成隨機(jī)字符串、顏色、線和點(diǎn),最終生成驗(yàn)證碼圖像
    2025-01-01
  • 基于Django框架的權(quán)限組件rbac實(shí)例講解

    基于Django框架的權(quán)限組件rbac實(shí)例講解

    今天小編就為大家分享一篇基于Django框架的權(quán)限組件rbac實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Pygame實(shí)現(xiàn)小球躲避實(shí)例代碼

    Pygame實(shí)現(xiàn)小球躲避實(shí)例代碼

    大家好,本篇文章主要講的是Pygame實(shí)現(xiàn)小球躲避實(shí)例代碼,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • python利用hook技術(shù)破解https的實(shí)例代碼

    python利用hook技術(shù)破解https的實(shí)例代碼

    python利用hook技術(shù)破解https的實(shí)例代碼,需要的朋友可以參考一下
    2013-03-03
  • 關(guān)于numpy中eye和identity的區(qū)別詳解

    關(guān)于numpy中eye和identity的區(qū)別詳解

    今天小編就為大家分享一篇關(guān)于numpy中eye和identity的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python編程中的反模式實(shí)例分析

    Python編程中的反模式實(shí)例分析

    這篇文章主要介紹了Python編程中的反模式,詳細(xì)講述了反模式的害處并以實(shí)例形式具體分析了容易造成的易錯(cuò)點(diǎn),對(duì)于Python學(xué)習(xí)來說具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • 讓Python程序定時(shí)執(zhí)行的8種方法整理

    讓Python程序定時(shí)執(zhí)行的8種方法整理

    在日常工作中,我們常常會(huì)用到需要周期性執(zhí)行的任務(wù),一種方式是采用?Linux?系統(tǒng)自帶的?crond?結(jié)合命令行實(shí)現(xiàn),另外一種方式是直接使用Python。本文整理了一下?Python?定時(shí)任務(wù)的實(shí)現(xiàn)方式,希望對(duì)大家有所幫助
    2023-01-01
  • Python操作MongoDB增刪改查代碼示例

    Python操作MongoDB增刪改查代碼示例

    這篇文章主要介紹了Python操作MongoDB增刪改查代碼示例,需要的朋友可以參考下
    2022-12-12

最新評(píng)論