[PYTHON] Implementieren Sie einen Teil des Prozesses in C ++

Wissenschaftliche Computerbibliotheken wie NumPy und SciPy sind nicht nur funktionsreich, sondern auch Dolmetscher. Es läuft so schnell, dass man es sich nicht als Sprache vorstellen kann. Dies sollte der Fall sein, und wie Sie dem Quellcode entnehmen können, verwendet die interne Implementierung tote Funktionen, die in Kompilierungssprachen wie C und Fortran geschrieben wurden.

Von den Berechnungen, die in Python und Ruby regelmäßig und wiederholt aufgerufen werden, ist es effizienter, die vielseitigen als Erweiterungen mit einer Kompilierungssprache wie C / C ++ zu beschreiben. Die Vor- und Nachteile sind wie folgt.

Selbst wenn Sie die Interpreter-Sprache später als Teil des Prototyping verwenden, bevor Sie sie in C / C ++ implementieren, können Sie sie möglicherweise wiederverwenden, indem Sie den Bibliotheksteil in C / C ++ schreiben.

Schreiben Sie eine Python-Erweiterungsbibliothek in C ++

Eine ausführliche Erklärung finden Sie in der offiziellen Dokumentation.

Python-Erweiterungen mit C und C ++ http://docs.python.jp/3.3/extending/extending.html

Die Python-API kann durch Einbetten von "Python.h" in die C-Welt integriert werden. Diese müssen vor der C / C ++ - Standardbibliothek aufgerufen werden.

Streit

static PyObject *
mymethod(PyObject *self, PyObject *args) {
  const char *text;
  if (!PyArg_ParseTuple(args, "s", &text))
    return NULL;
  ...
}

Funktionen haben immer zwei Argumente und werden üblicherweise als self und args behandelt.

Methodentabelle

Die Methodentabelle von PyMethodDef definiert, wie auf ein Objekt zugegriffen und eine Methode aus Python aufgerufen wird.

static PyMethodDef SomeMethods[] = {
    ...
    {"module_name",  module_name, METH_VARARGS,
     "Schreiben Sie hier eine Beschreibung"},
    ...
    {NULL, NULL, 0, NULL}        /* Sentinel */
};

Bibliotheksregistrierung

Der Code, der beim ersten Aufruf der Bibliothek initialisiert wird, ist PyMODINIT_FUNC. Stellen Sie sicher, dass PyModule_Create () zurückgegeben wird.

PyMODINIT_FUNC
PyInit_module_name(void) {
    return PyModule_Create(&module_name);
}

Erweiterung erstellen

Mit Distutils erstellen wird empfohlen.

from distutils.core import setup, Extension
module = Extension('module_name', ['mymodule.cpp'])
setup(name='module_name',
      version='1.0',
      ext_modules=[module],
     )

Der Rest kann mit setup.py verwendet werden.

python setup.py build
python setup.py install #Bei der Installation auf dem System

Nach der Installation können Sie jederzeit importieren. Wenn nicht, geben Sie einfach den Pfad der .so-Datei an und importieren Sie sie.

import module_name
module_name.some_method('args')

Verwenden Sie C ++

Für den offiziellen C ++ - Standard wird Standard lesen empfohlen. Alternativ ist C ++ - Nachschlagewerk verfügbar verfügbar, sodass Sie darauf verweisen können.

Verwenden Sie Boost

Boost umfasst Mitglieder des C ++ Standardization Committee Mit einer kostenlosen Bibliothek von Hand können Sie moderne Programmierung mit Vorlagen durchführen. Im folgenden Beispiel wird boost :: split verwendet, um einen String zu teilen.

#include <boost/algorithm/string.hpp> //Verwenden Sie Boost
#include <boost/foreach.hpp>
#include <string>
#include <list>
#include <iostream>

using namespace std; // std::Zum Namespace bringen
int main ()
{
    string str ("192.168.0.1 192.168.0.2");
    list<string> list_string;
    boost::split(list_string, str, boost::is_space()); //Teilen Sie die Zeichenfolge mit Leerzeichen

    BOOST_FOREACH(string s, list_string) {
        cout << s << endl;
    }
    return 0;
}

Verwenden Sie C ++ 11

Zum Zeitpunkt des Schreibens wurde bereits ein kleines Update für C ++ 11 C ++ 14 [entworfen](https: // github) erstellt. (com / cplusplus / Draft), aber unter Berücksichtigung von 2014 mindestens C ++ 11 oder höher kompatibler Code Wäre gut zu schreiben.

Das folgende Beispiel zeigt die Verwendung von C ++ 11 std :: array. Das Standardarray hat weniger Funktionalität als std :: vector. Andererseits umschließt std :: array das Raw-Array so, dass es wie std :: vector verwendet werden kann. Da es sich um einen Wrapper handelt, hat er die Funktion, dass die internen Kosten und die Geschwindigkeit fast denen des ursprünglichen Arrays entsprechen.

#include <algorithm>
#include <functional>
#include <array> // std::array
#include <iostream>

int main()
{
    std::array<int, 10> s = {5, 7, 4, 2, 8, 6, 1, 9, 0, 3}; // std::Array für Array

    std::sort(s.begin(), s.end(), std::greater<int>()); //Standard zum Sortieren eines Arrays::Verwenden Sie sort
    for (int a : s) {
        std::cout << a << " "; //Sortieren und in die Standardausgabe exportieren
    }
    std::cout << '\n';
}

Detaillierte Techniken zur Verwendung von C ++

Mit dem Alias -s von zsh können Sie Erweiterungen Funktionen zuweisen, mit denen Sie C ++ so verwenden können, als wäre es eine Skriptsprache.

function runcpp () { g++ -std=c++11 $1 && shift && ./a.out $@ } # -std=c++C um 11++11 Konform
alias -s {c,cpp}=runcpp #Weisen Sie der Erweiterung eine Funktion zu

Wenn Sie danach den Quellcode so starten, als ob das Ausführungsattribut wie ./my.cpp angegeben wäre, wird das Verarbeitungsergebnis zurückgegeben.

Bitte beachten Sie, dass C ++ 11 mit g ++ 4.7 und höher kompatibel ist. Es funktioniert möglicherweise nicht wie es ist mit älteren Distributionen von Paketen wie CentOS 6. (Für CentOS 6 ist es Verfügbar durch Hinzufügen eines Repositorys)

Zusammenfassung

Python ist als Klebesprache bekannt, aber wenn Sie den wichtigen Teil mit einer Erweiterungsbibliothek von C ++ schreiben, können Sie auch den Engpass beschleunigen. Wenn Sie beispielsweise eine neue Statistik- / maschinelle Lernbibliothek implementieren, ist es unter Berücksichtigung der realistischen Geschwindigkeit möglicherweise besser geeignet, eine Erweiterungsbibliothek zu verwenden, als sie nativ zu schreiben. Das Anwendungsspektrum wird erweitert.

Recommended Posts

Implementieren Sie einen Teil des Prozesses in C ++
Implementieren Sie die Lösung der Riccati-Algebra in Python
Implementieren Sie den Gaußschen Prozess in Pyro
Lassen Sie uns das Ausführungsergebnis des Programms mit C ++, Java, Python messen.
Die Geschichte der Teilnahme an AtCoder
Implementieren Sie das Singleton-Muster in Python
Verarbeiten Sie das Ergebnis von% time,% timeit
Die Geschichte des "Lochs" in der Akte
So implementieren Sie Java-Code im Hintergrund von Red Hat (Linux ONE)
[Verständnis in 3 Minuten] Der Beginn von Linux
Überprüfen Sie das Verhalten des Zerstörers in Python
Implementieren Sie den FIR-Filter in Python und C.
Das Ergebnis der Installation von Python auf Anaconda
Schriftliche Auswahlsortierung in C.
Grundlagen zum Ausführen von NoxPlayer in Python
Verstehen Sie den "temporären" Teil von UNIX / Linux
Auf der Suche nach dem schnellsten FizzBuzz in Python
Legen Sie den Prozessnamen des Python-Programms fest
Richtlinien für die Reinkarnation in der Welt der Linux-Programmierentwicklung (C / C ++ - Sprache)
Eine Geschichte über den Versuch, den Testprozess eines 20 Jahre alten Systems in C zu verbessern
Versuchen Sie, nur den Kern von Ubuntu zu installieren
Verwendung der C-Bibliothek in Python
Geben Sie die Anzahl der CPU-Kerne in Python aus
Bedeutung von {Versionsnummer} im MySQL-RPM-Paket
[Python] Sortieren Sie die Liste von pathlib.Path in natürlicher Reihenfolge
Ändern Sie die Schriftgröße der Legende in df.plot
Passen Sie die Verteilung jeder Gruppe in Python an
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
Lernen der Mustererkennung im Video Teil 1 Bereich der Mustererkennung
Kopieren Sie die Liste in Python
Finden Sie die Anzahl der Tage in einem Monat
Lesen Sie die Ausgabe von subprocess.Popen in Echtzeit
Finden Sie den Bruchteil des in Python eingegebenen Werts heraus
Senden Sie Google Mail am Ende des Vorgangs [Python]
[Python] Lesen Sie den Quellcode von Flasche Teil 1
Implementieren Sie mit OpenModelica das mathematische Modell "SIR-Modell" von Infektionskrankheiten (siehe Wirkung des Impfstoffs)
Die Geschichte, das optimale n in N Faust zu finden
DICOM-Bilder mit Python Part 2 entfernen
Korrigieren Sie die Argumente der in map verwendeten Funktion
Finden Sie die Lösung der Gleichung n-ter Ordnung mit Python
Die Geschichte des Lesens von HSPICE-Daten in Python
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Lösen von Bewegungsgleichungen in Python (odeint)
Visualisierte den Nutzungsstatus der Spüle im Unternehmen
Ausgabe in Form eines Python-Arrays
Holen Sie sich nur den Adressteil der Netzwerkkarte (eth0)
Die Geschichte der Anzeige von Mediendateien in Django
Suchen Sie nach dem Wert der Instanz in der Liste
Implementieren Sie REPL
Machen Sie den Fortschritt von dd in der Fortschrittsanzeige sichtbar
Ich habe versucht, Human In The Loop zu implementieren - Teil ① Dashboard -
[Python + OpenCV] Malen Sie den transparenten Teil des Bildes weiß
Wenn eine Datei im freigegebenen Ordner von Raspberry Pi abgelegt wird, wird der Vorgang ausgeführt.
So zeigen Sie das Änderungsdatum einer Datei in C-Sprache bis zu Nanosekunden an