Erweitern Sie Python in C ++ (Boost.NumPy)

Warum C ++ - Klassen / Funktionen an Python binden?

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.

Wie binde ich?

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.

Dokument erstellen

cd libs/numpy/doc
make

Sie können das Dokument anzeigen, indem Sie "libs / numpy / doc / _build / html / index.html" als öffnen

Installation von cmake

Detailliert im obigen Dokument (weggelassen) Zum Kompilieren in der Python3-Umgebung sind einige Änderungen erforderlich.

Wie benutzt man

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

Erweitern Sie Python in C ++ (Boost.NumPy)
Weiter Python in C-Sprache
C-API in Python 3
Boost.NumPy Tutorial zum Erweitern von Python in C ++ (Übung)
Binäre Suche in Python / C ++
ABC166 in Python A ~ C Problem
Löse ABC036 A ~ C mit Python
So verpacken Sie C in Python
Löse ABC037 A ~ C mit Python
Schreiben Sie einen C-Sprach-Unit-Test in Python
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Löse ABC175 A, B, C mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Algorithmus in Python (ABC 146 C Dichotomie
Implementieren Sie den FIR-Filter in Python und C.
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
Schreiben Sie die O_SYNC-Datei in C und Python
N-Gramm in Python
Programmieren mit Python
Python C ++ Notizen
Plink in Python
Konstante in Python
Python, openFrameworks (c ++)
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Generieren Sie mit Python eine C-Sprache aus dem S-Ausdruck
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Führen Sie Python in C ++ unter Visual Studio 2017 aus
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken