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.
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.
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.
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 */
};
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);
}
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')
Für den offiziellen C ++ - Standard wird Standard lesen empfohlen. Alternativ ist C ++ - Nachschlagewerk verfügbar verfügbar, sodass Sie darauf verweisen können.
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;
}
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';
}
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)
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.