C++ Academy · Pelajaran

Memanggil Python daripada C++ melalui pybind11

Balut kod C++ sebagai modul Python menggunakan pybind11.

Pelajaran 2 daripada 414 langkah

Memanggil Python daripada C++ melalui pybind11 ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Mengapa pybind11?

pybind11 ialah pustaka berasaskan fail pengepala sahaja yang mencipta pengikatan Python untuk kod C++ dengan kod rangka yang minimum. Ia digunakan oleh SciPy, TensorFlow dan banyak projek lain.

Modul Minimum

Takrifkan modul Python dalam satu fail menggunakan makro PYBIND11_MODULE.

#include <pybind11/pybind11.h>
namespace py = pybind11;

int add(int a, int b) { return a + b; }

PYBIND11_MODULE(mymodule, m) {
    m.def("add", &add, "Add two integers");
}

Membina Modul

Bina sebagai modul sambungan Python — biasanya dengan CMake atau setuptools.

# CMake
find_package(pybind11 REQUIRED)
pybind11_add_module(mymodule mymodule.cpp)

Menggunakan dari Python

Import dan gunakan seperti mana-mana modul Python.

# Python
import mymodule
print(mymodule.add(2, 3))   # 5

Mendedahkan Kelas

Gunakan py::class_ untuk mengikat kelas C++. Pembina, kaedah dan sifat semuanya dipetakan kepada padanan Python.

class Point {
public:
    Point(int x, int y) : x_(x), y_(y) {}
    int x() const { return x_; }
    int y() const { return y_; }
private:
    int x_, y_;
};

PYBIND11_MODULE(geom, m) {
    py::class_<Point>(m, "Point")
        .def(py::init<int, int>())
        .def("x", &Point::x)
        .def("y", &Point::y);
}

Penukaran Jenis

pybind11 menukar jenis umum secara automatik:

  • std::string ↔ Python str
  • std::vector<T> ↔ Python list
  • std::map ↔ Python dict
  • Jenis angka ↔ Python int/float

Saling Kendali NumPy

Hantar tatasusunan NumPy sebagai py::array_t<T>. Capaikan penimbal untuk operasi tanpa salinan.

void scale(py::array_t<double> arr, double factor) {
    auto buf = arr.mutable_unchecked<1>();
    for (size_t i = 0; i < buf.size(); ++i)
        buf(i) *= factor;
}

Lambda sebagai Pengikatan

Ikat lambda secara langsung apabila anda mahu mengubah argumen atau membungkus tingkah laku.

m.def("show", [](const Point& p) {
    return "(" + std::to_string(p.x()) + ", " + std::to_string(p.y()) + ")";
});

Melepaskan GIL

Untuk pengiraan C++ yang panjang, lepaskan GIL supaya utas Python lain boleh berjalan.

m.def("slow", []() {
    py::gil_scoped_release release;
    // expensive C++ work, no Python access
});

Prestasi

pybind11 menambah overhed yang minimum — biasanya beberapa ratus nanosaat bagi setiap panggilan. Tidak ketara untuk fungsi yang tidak remeh, tetapi penting dalam gelung ketat dengan fungsi yang dipanggilnya murah.

Alternatif

Jambatan Python-C++ lain:

  • Boost.Python — lebih lama dan lebih berat
  • SWIG — menyokong banyak bahasa
  • nanobind — lebih baharu dan lebih pantas daripada pybind11

Kes Penggunaan Dunia Sebenar

pybind11 sesuai untuk:

  • Membalut pustaka C++ untuk pengguna Python
  • Mempercepat laluan panas Python dengan kod C++
  • Berkongsi teras berangka antara aplikasi C++ dan alat Python

Semakan Pantas

Makro apakah yang digunakan oleh pybind11 untuk mengisytiharkan modul Python?

Rumusan

pybind11 menjadikan pembungkusan C++ untuk Python hampir tanpa usaha. Isytiharkan modul dengan PYBIND11_MODULE, ikat fungsi dengan m.def dan kelas dengan py::class_. Penukaran terbina dalam meliputi jenis STL; tatasusunan NumPy tidak memerlukan penyalinan data.

Percuma untuk bermula

Pelajari C++ dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “Memanggil Python daripada C++ melalui pybind11” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Memanggil Python daripada C++ melalui pybind11”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Memanggil Python daripada C++ melalui pybind11”?

Balut kod C++ sebagai modul Python menggunakan pybind11. Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Memanggil Python daripada C++ melalui pybind11” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?

Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Extern C dan ABI C
  2. Memanggil Python daripada C++ melalui pybind11
  3. C++ untuk Sempadan FFI Rust
  4. Menggunakan SWIG untuk Binding Berbilang Bahasa
← Kembali ke C++ Academy