国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

如何從 Python 調(diào)用C++

這篇具有很好參考價(jià)值的文章主要介紹了如何從 Python 調(diào)用C++。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、說明

????????Python是一種高級(jí)編程語言,它可以調(diào)用其他語言編寫的函數(shù)。在 Python 中調(diào)用 C 函數(shù)的方法有兩種:1)使用 Python 提供的 ctypes 庫;2)使用 Python 提供的 Cython 庫。

????????注意:您可以在此存儲(chǔ)庫中下載此示例的完整代碼。如果您對(duì)本文有任何意見,可以在那里開始一個(gè)問題,或與我聯(lián)系。

二、PyBind11 vs ctypes

????????基本上有兩種方法可以從 Python 調(diào)用C++:使用 PyBind11 C++ 庫生成 Python 模塊,或者使用 cytpes Python 包訪問編譯的共享庫。使用 PyBind11,我們可以更輕松地共享許多數(shù)據(jù)類型,而使用?ctypes 是一種低級(jí)的 C 樣式解決方案。

????????就我而言,我希望能夠利用C++性能和可移植性,但我不想放棄解釋語言的交互性以進(jìn)行快速探索和調(diào)試。

????????幸運(yùn)的是,從Python調(diào)用C++并不像一開始看起來那么困難。這樣,我們可以在開發(fā)C++代碼的同時(shí)掌握 Python 的一些交互性。

就我而言,我想使用 Python 來:

  • 將一些問題參數(shù)傳遞給C++
  • 調(diào)用C++代碼以運(yùn)行計(jì)算密集型例程
  • 檢索最終結(jié)果,以及一些用于調(diào)試的中間計(jì)算。
  • 以交互方式瀏覽結(jié)果,并生成繪圖和報(bào)告。

????????使用 ctypes 的問題在于,共享許多數(shù)據(jù)類型需要相當(dāng)多的低級(jí)解決方法。例如,雖然ctypes不支持復(fù)數(shù)等基本的東西,但PyBind11使Numpy與Eigen完全互操作,需要最少的代碼。

????????但是,我也發(fā)現(xiàn)了?PyBind11 的小問題。事實(shí)證明,在重新編譯C++代碼并嘗試重新加載 PyBind 生成的 Python 模塊后,什么也沒發(fā)生。重新加載編譯模塊的唯一方法是重新啟動(dòng)我的 Python 會(huì)話。無論如何,這沒什么大不了的,因?yàn)镻ython的啟動(dòng)時(shí)間可以忽略不計(jì)。而且,此步驟可能在 IDE 級(jí)別自動(dòng)執(zhí)行。

????????因此,現(xiàn)在的問題是如何充分利用 PyBind11。

三、與 PyBind11 共享C++類

????????PyBind11 的官方文檔非常出色,我可以毫無問題地開始使用它。但是,我想分享這個(gè)庫的超級(jí)快速入門指南,以及我打算如何使用它。

????????Pybind11 是一個(gè)僅標(biāo)頭庫,你可以通過以下方式獲取它:

?
pip install pybind11

????????雖然沒有必要將所有C++代碼構(gòu)建為一個(gè)類,但如果你有一個(gè)類要在C++和 Python 之間共享,Pybind11 會(huì)讓你的事情變得非常容易。(其實(shí)我更像是那種人,總是想介紹給定項(xiàng)目中最少的類數(shù))vectorstruct

????????然而,在這種情況下,我發(fā)現(xiàn)使用外觀設(shè)計(jì)模式(參見wiki)可以同時(shí)導(dǎo)致非常簡(jiǎn)單的Python/C++互操作性和一個(gè)不錯(cuò)的API。

????????所以,我想出了一個(gè)簡(jiǎn)單的課程。它基本上包含:

  • 讀取問題參數(shù)的構(gòu)造函數(shù)。
  • 執(zhí)行計(jì)算的函數(shù)。run()
  • 一些數(shù)組作為公共變量來存儲(chǔ)結(jié)果。Eigen

????????這是我的最小示例:

// mylib.h
#include <Eigen/Dense>
#include <cmath>

using Eigen::Matrix, Eigen::Dynamic;
typedef Matrix<std::complex<double>, Eigen::Dynamic, Eigen::Dynamic> myMatrix;

class MyClass {

    int N;
    double a;
    double b;

public:

    Eigen::VectorXd v_data;
    Eigen::VectorXd v_gamma;

    MyClass(){}
    MyClass( double a_in, double b_in, int N_in) 
    {
        N = N_in;
        a = a_in;
        b = b_in;
    }

    void run() 
    { 
        v_data = Eigen::VectorXd::LinSpaced(N, a, b); 

        auto gammafunc = [](double it) { return std::tgamma(it); };
        v_gamma = v_data.unaryExpr(gammafunc);
    }
};

????????要共享這個(gè)類,我們需要添加一些C++代碼。我寧愿在一個(gè)單獨(dú)的文件中執(zhí)行此操作,其中包含創(chuàng)建 python 包裝器所需的一切。

?
// pywrap.cpp
#include <pybind11/pybind11.h>
#include <pybind11/eigen.h>
#include "mylib.h"

namespace py = pybind11;
constexpr auto byref = py::return_value_policy::reference_internal;

PYBIND11_MODULE(MyLib, m) {
    m.doc() = "optional module docstring";

    py::class_<MyClass>(m, "MyClass")
    .def(py::init<double, double, int>())  
    .def("run", &MyClass::run, py::call_guard<py::gil_scoped_release>())
    .def_readonly("v_data", &MyClass::v_data, byref)
    .def_readonly("v_gamma", &MyClass::v_gamma, byref)
    ;
}

????????需要強(qiáng)調(diào)的幾點(diǎn):

  • 類構(gòu)造函數(shù)簽名指定為.def(py::init<int, double, double>())
  • 對(duì)于函數(shù),我們希望釋放 GIL(全局解釋器鎖),這將阻止我們的函數(shù)使用多個(gè)線程。run()

????????最后,可以使用以下文件進(jìn)行編譯:CMakeLists.txt

?
cmake_minimum_required(VERSION 3.10)

project(MyLib)
set(CMAKE_CXX_STANDARD 20)
set(PYBIND11_PYTHON_VERSION 3.6)
set(CMAKE_CXX_FLAGS "-Wall -Wextra -fPIC")

find_package(pybind11 REQUIRED)
find_package(Eigen3 REQUIRED)

pybind11_add_module(${PROJECT_NAME} pywrap.cpp)

target_compile_definitions(${PROJECT_NAME} PRIVATE VERSION_INFO=${EXAMPLE_VERSION_INFO})
target_include_directories(${PROJECT_NAME} PRIVATE ${PYBIND11_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} PRIVATE Eigen3::Eigen)

????????現(xiàn)在你已經(jīng)準(zhǔn)備好了。如果您使用的是 VS Code,則在配置 CMake 擴(kuò)展后,只需按 F7 即可編譯C++庫。

四、從 Python 調(diào)用C++庫

????????這個(gè)過程非常簡(jiǎn)單,應(yīng)該開箱即用。但是,有幾個(gè)步驟可以優(yōu)化交互式工作流,這些步驟稍微棘手一些,也值得實(shí)施。

????????例如,如果您正在執(zhí)行 Python 環(huán)境并且您的編譯庫進(jìn)入一個(gè)目錄,您可以執(zhí)行以下操作:build

?
import sys
sys.path.append("build/")
from MyLib import MyClass

import matplotlib.pyplot as plt

Simulation = MyClass(-4,4,1000)
Simulation.run()

plt.plot(Simulation.v_data, Simulation.v_gamma, \
"--", linewidth = 3, color=(1,0,0,0.6),label="Function Value")
plt.ylim(-10,10)
plt.xlabel("x")
plt.ylabel("($f(x) = \gamma(x)$)")
plt.title("(Gamma Function: $\gamma(z) = \int_0^\infty x^{z-1} e^{-x} dx$)",fontsize = 18);
plt.show()

python調(diào)用c++函數(shù),BOOST C++,python技能小結(jié),python,c++,開發(fā)語言

????????請(qǐng)注意,特征向量會(huì)自動(dòng)轉(zhuǎn)換為?Python 數(shù)組。

????????Ater 修改 ,每個(gè)我們要公開的新函數(shù)或變量只需要添加一行代碼。myLib.hpppywrap.cpp

????????不幸的是,這不會(huì)帶來完全交互式的工作流程。當(dāng)您在更改后重新編譯C++代碼時(shí),Python 端不會(huì)發(fā)生任何事情。即使您嘗試使用以下方法重新加載 Python 模塊:importtools

?
import importlib
importlib.reload(MyLib)

????????什么也沒發(fā)生。原因是編譯后的代碼無法在 Python 中重新加載。

????????因此,在使用 PyBind11 時(shí),每次重新編譯C++代碼時(shí)都需要重新啟動(dòng) Python 會(huì)話,我覺得這對(duì)于開發(fā)目的來說有點(diǎn)煩人。但是,這是一個(gè)很小的代價(jià),因?yàn)镻ython的啟動(dòng)時(shí)間可以忽略不計(jì),并且可能有一種方法可以使用一些IDE熱鍵或其他工具使該過程自動(dòng)化。

五、總結(jié)

????????因此,這就是您可以輕松地從 Python 調(diào)用C++庫的方式。

????????特別是,這個(gè)兩步過程可以產(chǎn)生一個(gè)非?;?dòng)的開發(fā)工作流程。盡管我們有一個(gè)編輯-編譯-運(yùn)行工作流,但我們?cè)谧詈筇砑恿艘粋€(gè)解釋器,所以現(xiàn)在我們的工作流看起來像編輯-編譯-運(yùn)行-探索。

????????將來,我計(jì)劃將兩個(gè)功能合并到此工作流中:文章來源地址http://www.zghlxwxcb.cn/news/detail-703180.html

  • 第一個(gè)是C++20模塊,它應(yīng)該加快大型C++項(xiàng)目的編譯時(shí)間。不幸的是,CMake 仍然與模塊不兼容(有關(guān)更新,請(qǐng)參閱此問題),顯然人們必須依靠像?Ninja-Build?這樣的構(gòu)建系統(tǒng)才能立即提供此功能。
  • 另一件事是解決在重新編譯C++代碼后(手動(dòng))重新啟動(dòng) Python 會(huì)話的需要。為此,我希望也許可以在VSCode級(jí)別對(duì)此做點(diǎn)什么。到目前為止,VS Code 中的最佳選項(xiàng)似乎是終止 Python 會(huì)話,然后使用 執(zhí)行 Python 代碼,如果尚未打開會(huì)話,則會(huì)創(chuàng)建一個(gè)新會(huì)話。Shift+Enter

到了這里,關(guān)于如何從 Python 調(diào)用C++的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • chatgpt賦能python:Python調(diào)用主函數(shù)語句

    Python是一種高級(jí)編程語言,語法簡(jiǎn)單,易于學(xué)習(xí)和使用。在Python程序中,主函數(shù)是程序的入口,是程序的核心。本文將介紹Python調(diào)用主函數(shù)語句的相關(guān)知識(shí)。 在Python程序中,主函數(shù)也稱為程序入口函數(shù),是整個(gè)程序的核心。主函數(shù)通常包含程序的主要邏輯和功能,用于執(zhí)行程

    2024年02月11日
    瀏覽(27)
  • Python 調(diào)用自定義函數(shù)

    Python 調(diào)用自定義函數(shù)

    新手入坑。 通常我們需要把公共函數(shù)提出來,作為公共資源調(diào)用。也避免了代碼的重復(fù)書寫。 比如我們?cè)陧?xiàng)目內(nèi)創(chuàng)建我們的py腳本路徑如下: 在公共方法中定義方法: 在其他腳本中調(diào)用如下:

    2024年02月14日
    瀏覽(25)
  • python 函數(shù)調(diào)用

    一、函數(shù)的定義 首先語法格式: 二、函數(shù)的調(diào)用 1.求兩個(gè)整數(shù)的和: 運(yùn)行結(jié)果: 2.關(guān)鍵參數(shù) 關(guān)鍵參數(shù)指通過對(duì)形參賦值的方式傳遞參數(shù),避免了傳遞實(shí)參過程中,與定義函數(shù)的形參順序不一致的情況。 運(yùn)行結(jié)果: 3.默認(rèn)參數(shù) 在函數(shù)定義時(shí)參數(shù)列表中的某個(gè)形參有值,則這

    2024年02月14日
    瀏覽(15)
  • Python 函數(shù)的定義與調(diào)用

    Python 函數(shù)的定義與調(diào)用

    ?作者簡(jiǎn)介:人工智能專業(yè)本科在讀,喜歡計(jì)算機(jī)與編程,寫博客記錄自己的學(xué)習(xí)歷程。 ??個(gè)人主頁:小嗷犬的博客 ??個(gè)人信條:為天地立心,為生民立命,為往圣繼絕學(xué),為萬世開太平。 ??本文內(nèi)容:Python 函數(shù)的定義與調(diào)用 Python 中使用 def 語句創(chuàng)建函數(shù),其一般的格

    2024年01月25日
    瀏覽(26)
  • Python中函數(shù)間的調(diào)用

    本文將詳細(xì)介紹Python中函數(shù)間的調(diào)用方法以及如何傳遞參數(shù)、返回值等操作。我們將從以下幾個(gè)方面進(jìn)行闡述: Python中函數(shù)的調(diào)用十分簡(jiǎn)單,我們只需要在函數(shù)名后面加上一對(duì)小括號(hào)即可。例如: 在上面的例子中,我們定義了兩個(gè)函數(shù)\\\"func1\\\"和\\\"func2\\\",在\\\"func2\\\"函數(shù)里面調(diào)用了

    2024年02月02日
    瀏覽(21)
  • Python通過函數(shù)名調(diào)用函數(shù)的幾種場(chǎng)景

    除了執(zhí)行系統(tǒng)命令外,我們有時(shí)還需要?jiǎng)討B(tài)地執(zhí)行一些python代碼,有經(jīng)驗(yàn)的朋友就會(huì)知道可以使用內(nèi)置函數(shù)eval實(shí)現(xiàn)這一需求,如 eval(\\\"print(__file__)\\\") ,這還是比較簡(jiǎn)單的。 但如果要?jiǎng)討B(tài)執(zhí)行一個(gè)函數(shù),講的資料就會(huì)少一點(diǎn),這次就要看這個(gè)需求該如何實(shí)現(xiàn)。 1 通過eval調(diào)用同一

    2024年04月13日
    瀏覽(28)
  • Python 函數(shù):定義、調(diào)用、參數(shù)、遞歸和 Lambda 函數(shù)詳解

    Python 函數(shù):定義、調(diào)用、參數(shù)、遞歸和 Lambda 函數(shù)詳解

    函數(shù)是一段代碼塊,只有在調(diào)用時(shí)才會(huì)運(yùn)行。您可以將數(shù)據(jù)(稱為參數(shù))傳遞給函數(shù)。 函數(shù)可以返回?cái)?shù)據(jù)作為結(jié)果。 在Python中,使用def定義函數(shù): 示例 要調(diào)用函數(shù),請(qǐng)使用函數(shù)名稱后跟括號(hào): 示例 可以將信息作為參數(shù)傳遞給函數(shù)。參數(shù)在函數(shù)名稱后面的括號(hào)內(nèi)指定

    2024年02月08日
    瀏覽(24)
  • chatgpt賦能python:Python如何分行——提高代碼可讀性和效率的必備技能

    分行,即將一行長代碼分為多行,使得代碼更加易讀、易維護(hù)、易修改。 Python作為一門高級(jí)編程語言,具有簡(jiǎn)潔、易讀、高效的特點(diǎn)。但在實(shí)際編程過程中,難免會(huì)遇到較長的代碼行,導(dǎo)致代碼可讀性下降,不利于程序員的開發(fā)和維護(hù)。因此,Python中分行技術(shù)就顯得尤為重要

    2024年02月08日
    瀏覽(32)
  • Python調(diào)用C++

    Python調(diào)用C++

    python被稱為膠水語言,其優(yōu)勢(shì)是能夠粘結(jié)各種不同的語言。同時(shí),python有著更大的“親民性”,很容易進(jìn)行開發(fā)。但是,python最大的問題就是 計(jì)算速度不夠 。通常可以用CUDA或者C++對(duì)一個(gè)python程序進(jìn)行加速,加速策略如下: 大規(guī)模算術(shù)運(yùn)算、矩陣運(yùn)算等過程用底層語言這里使

    2024年02月03日
    瀏覽(19)
  • 【30天python從零到一】---第六天:函數(shù)、變量作用域、函數(shù)的鏈?zhǔn)秸{(diào)用和遞歸調(diào)用

    【30天python從零到一】---第六天:函數(shù)、變量作用域、函數(shù)的鏈?zhǔn)秸{(diào)用和遞歸調(diào)用

    ?? 博客主頁:??@披星戴月的賈維斯 ?? 歡迎關(guān)注:??點(diǎn)贊??收藏??留言 ??系列專欄:?? Python專欄 ??請(qǐng)不要相信勝利就像山坡上的蒲公英一樣唾手可得,但是請(qǐng)相信,世界上總有一些美好值得我們?nèi)σ愿?,哪怕粉身碎骨?? ??一起加油,去追尋、去成為更好的自己

    2023年04月14日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包