Avec pybind11
, qui peut intégrer Python et C ++,
Vous pouvez passer une liste de Python à une fonction C ++ via un conteneur STL.
[Lien externe: Comment exécuter du code C ++ à partir de Python à l'aide de pybind11](https://myenigma.hatenablog.com/entry/2016/12/17/075812#STL%E3%81%AE%E3%82% B3% E3% 83% B3% E3% 83% 86% E3% 83% 8A% E3% 81% AE% E3% 82% 84% E3% 82% 8A% E5% 8F% 96% E3% 82% 8A)
Cependant, cela est passé par valeur, vous devez donc le retourner du côté C ++ pour utiliser la liste mise à jour en Python.
D'un autre côté, lors de l'utilisation d'actifs C ++ existants, je ne souhaite pas modifier le code source C ++ autant que possible, donc Vous ne souhaiterez peut-être pas définir une nouvelle valeur de retour ou réécrire la mise à jour.
Donc, en passant par Numpy au lieu d'une liste Bien que l'utilisation soit limitée, elle peut être transmise par référence, nous allons donc la partager.
Fondamentalement, je pense qu'il est préférable d'utiliser «mutable_data» et «Eigen» expliqué dans les liens ci-dessous. En dehors de cela, il existe un contenu comme celui-ci. Introduction au lien externe pybind11 (3) coopération NumPy partie 1 Introduction au lien externe pybind11 (3) coopération NumPy partie 2
Définissez la fonction ʻupdate1 () qui passe la liste via le conteneur STL et la fonction ʻupdate2 ()
qui est passée par Numpy.
Les deux essaient de mettre à jour la valeur du tableau reçu à 1.0.
hoge.cpp
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
#include <vector>
namespace py = pybind11;
void update1(std::vector<double> &x)
{
int i;
for(i = 0; i < 3; i ++)
{
x[i] = 1.0;
}
}
void update2(py::array_t<double> x)
{
auto x_buf = x.request();
double *x_ptr = (double *)x_buf.ptr;
int i;
for(i = 0; i < 3; i ++)
{
x_ptr[i] = 1.0;
}
}
PYBIND11_MODULE(hoge, m)
{
m.doc() = "hoge module";
m.def("update1", &update1, "update1 function");
m.def("update2", &update2, "update2 function");
}
Passez la liste [1., 2., 3.]
à ʻupdate1, ʻupdate2
,
Un script qui vérifie comment la liste change après l'application de chaque fonction.
test.py
import numpy as np
import hoge
x = [1., 2., 3.]
print(x)
hoge.update1(x)
print(x)
x = np.array(x)
hoge.update2(x)
print(x)
[1.0, 2.0, 3.0]
[1.0, 2.0, 3.0]
[1. 1. 1.]
Vous pouvez voir que la valeur n'est pas mise à jour avec ʻupdate1 et est mise à jour avec ʻupdate2
.
Comme expliqué dans le lien de référence, si le type (double cette fois) ne correspond pas du côté Python et du côté C ++ Veuillez noter qu'il sera passé par valeur.
Recommended Posts