C ++ 11 est devenu très pratique. C'est encore plus pratique avec Boost. Mais python est plus facile à utiliser. Projets basés sur NumPy (SciPy, matplotlib, pandas, ...) Est très facile à utiliser et est maintenu sur une plate-forme commune et fonctionne raisonnablement rapidement. Dois-je utiliser C ++ ou me lier à Python? De plus, je ne suis pas parvenu à une conclusion, mais je vais résumer les informations pour la liaison pour le moment.
Il y a deux problèmes.
L'une des raisons d'utiliser Python est d'utiliser des bibliothèques basées sur NumPy, donc
Il doit pouvoir se convertir en ndarray
de NumPy, etc.
La base est API C Python et [API NumPy C](http://docs.scipy.org/doc/ numpy / reference / c-api.html). Liez les fonctions et classes C ++ à Python via ces derniers. C ++ peut bien sûr appeler directement l'API C Python, Vous devez contrôler vous-même le nombre de références. C'est trop difficile à jouer, donc Boost.Python encapsule cette zone comme C ++. Le nombre de références est géré par le pointeur intelligent.
D'un autre côté, l'API NumPy C est différente de l'API Python C, donc Boost.Python lui-même n'inclut pas de wrapper pour l'API de NumPy. Donc, basé sur Boost.Python, une interface pour NumPy L'implémentation est Boost.NumPy. J'ai écrit qu'il se trouve actuellement dans le bac à sable Boost, Il semble que Sandbox n'ait pas fonctionné depuis que le développement de Boost lui-même a été transféré sur Github. Le développement se fait sur github. Je ne sais pas où je me situe en tant que Boost.
Install
git clone https://github.com/ndarray/Boost.NumPy
cd Boost.NumPy
Je partirai du principe que je l’ai fait.
cd libs/numpy/doc
make
Vous pouvez voir le document en ouvrant libs / numpy / doc / _build / html / index.html
comme
Détaillé dans le document ci-dessus (omis) Certaines modifications sont nécessaires pour compiler dans l'environnement python3.
Pour utiliser divers algorithmes SciPy Une fonction qui prend «numpy.ndarray» comme argument et renvoie le même «ndarray» est requise.
Créer ndarray, qui est le cœur de NumPy, en C ++
project/CMakeLists.txt
numpy.cpp
numpy.cpp
#include "boost/numpy.hpp"
namespace p = boost::python;
namespace np = boost::numpy;
np::ndarray new_zero1(unsigned int N) {
p::tuple shape = p::make_tuple(N);
np::dtype dtype = np::dtype::get_builtin<double>();
return np::zeros(shape, dtype);
}
BOOST_PYTHON_MODULE(mymodule) {
Py_Initialize();
np::initialize();
p::def("new_zero", new_zero1);
}
Écrivez comme ça. C'est assez intuitif à écrire.
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
# set(CMAKE_VERBOSE_MAKEFILE 1)
find_package(Boost COMPONENTS python3 REQUIRED) # for python3
find_package(PythonLibs REQUIRED)
include_directories(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})
add_library(mymodule SHARED numpy.cpp)
target_link_libraries(mymodule ${Boost_LIBRARIES} ${PYTHON_LIBRARY} boost_numpy)
set_target_properties(mymodule PROPERTIES PREFIX "") #préfixe'lib'Omettre
cmake .
make
Cela créera mymodule.so
.
Si vous n'écrivez pas set_target_properties, ce sera libmymodule.so
.
Notez qu'il peut s'agir de BIBLIOTHÈQUES ou de BIBLIOTHÈQUES.
Utilisation plus détaillée la prochaine fois.
Recommended Posts