C ++ 11 ist sehr praktisch geworden. Mit Boost ist es noch bequemer. Python ist jedoch einfacher zu verwenden. Projekte basierend auf NumPy (SciPy, matplotlib, pandas, ...) Ist sehr einfach zu bedienen und wird auf einer gemeinsamen Plattform gewartet und arbeitet relativ schnell. Soll ich C ++ verwenden oder an Python binden? Ich bin auch noch nicht zu einem Schluss gekommen, aber ich werde die Informationen für die Bindung vorerst zusammenfassen.
Es gibt zwei Probleme.
Einer der Gründe für die Verwendung von Python ist die Verwendung von NumPy-basierten Bibliotheken Es muss in der Lage sein, zu NumPys "ndarray" usw. zu konvertieren.
Die Basis sind Python C API und NumPy C API. numpy / reference / c-api.html). Binden Sie über diese C ++ - Funktionen und -Klassen an Python. C ++ kann die Python C-API natürlich direkt aufrufen. Sie müssen den Referenzzähler selbst steuern. Dies ist zu schwierig zu spielen, daher umschließt Boost.Python diesen Bereich wie C ++. Der Referenzzähler wird vom Smart Pointer verwaltet.
Andererseits unterscheidet sich die NumPy C-API von der Python C-API Boost.Python selbst enthält keinen Wrapper für die NumPy-API. Basierend auf Boost.Python, einer Schnittstelle für NumPy Die Implementierung ist Boost.NumPy. Ich schrieb, dass es derzeit in der Boost-Sandbox ist, Es scheint, dass Sandbox seit dem Umzug von Boost nach Github nicht mehr in Betrieb war. Die Entwicklung erfolgt unter github. Ich bin mir nicht sicher, wo ich als Boost stehe.
Install
git clone https://github.com/ndarray/Boost.NumPy
cd Boost.NumPy
Ich werde davon ausgehen, dass ich es getan habe.
cd libs/numpy/doc
make
Sie können das Dokument anzeigen, indem Sie "libs / numpy / doc / _build / html / index.html" als öffnen
Detailliert im obigen Dokument (weggelassen) Zum Kompilieren in der Python3-Umgebung sind einige Änderungen erforderlich.
Verwendung verschiedener SciPy-Algorithmen Eine Funktion, die "numpy.ndarray" als Argument verwendet und dasselbe "ndarray" zurückgibt, ist erforderlich.
Erstellen Sie ndarray, das Herzstück von NumPy, in 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);
}
Schreiben Sie so. Es ist ziemlich intuitiv zu schreiben.
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äfix'lib'Auslassen
cmake .
make
Dadurch wird "mymodule.so" erstellt. Wenn Sie set_target_properties nicht schreiben, lautet es "libmymodule.so". Beachten Sie, dass es sich möglicherweise um BIBLIOTHEK oder BIBLIOTHEKEN handelt.
Detailliertere Verwendung beim nächsten Mal.
Recommended Posts