Ich kann nicht herausfinden, wie ctypes die Lücke zwischen std::vector
und Python überbrücken wird; Nein, wo im Internet ist die Kombination erwähnt. Ist das eine schlechte Übung, existiert sie nicht oder fehlt mir etwas?
C ++ : xxx.cpp
%Vor%Python: xxx.py
%Vor%Der besondere Grund ist, dass Geschwindigkeit wichtig ist. Ich erschaffe ein Anwendung, die in der Lage sein sollte, mit Big Data umzugehen. Auf 200.000 Zeilen Die Missings müssen auf 300 Werte (200k by 300 Matrix) gezählt werden. ich glaube, aber korrigiere mich wenn ich falsch liege, dass C ++ deutlich wird schneller.
Nun, wenn Sie von einer großen Datei lesen, wird Ihr Prozess meistens IO-gebunden sein, so dass die Zeit zwischen Python und C wahrscheinlich nicht signifikant anders sein wird.
Der folgende Code ...
%Vor%... scheint genau so schnell zu laufen wie alles, was ich in C zusammenhacken kann, obwohl es einige optimierter Algorithmus bin ich nicht wirklich vertraut.
Es dauert weniger als eine Sekunde, um 200.000 Zeilen zu verarbeiten, obwohl mich interessieren würde, ob Sie eine C-Funktion schreiben können, die wesentlich schneller ist.
Aktualisieren
Wenn Sie es in C machen und mit einer Python-Liste enden wollen, ist es wahrscheinlich effizienter, zu verwenden Python / C API , um die Liste selbst zu erstellen, anstatt ein std::vector
zu erstellen und später zu einer Python-Liste zu konvertieren.
Ein Beispiel, das nur eine Liste von Ganzzahlen von 0 bis 99 zurückgibt ...
%Vor%Kompiliert mit ...
%Vor%Anwendungsbeispiel ...
%Vor% Unabhängig davon, ob dieser Ansatz tatsächlich eine schnellere Ausführungszeit bietet oder nicht, erkläre ich Ihnen ein wenig, wie Sie dabei vorgehen könnten. Im Grunde erstellen Sie einen Zeiger auf ein C ++ vector
, das über C-Funktionen mit Python interagieren kann. Sie können dann den C ++ - Code in eine Python-Klasse einfügen und die Implementierungsdetails von ctypes
ausblenden.
Ich habe etwas eingefügt, von dem ich dachte, dass es hilfreich wäre, magische Methoden in die Python-Klasse aufzunehmen. Sie können diese entfernen oder weitere hinzufügen, um Ihren Anforderungen zu entsprechen. Der Destruktor ist wichtig, um zu behalten.
Kompilieren Sie es als eine gemeinsame Bibliothek. Unter Mac OS X könnte dies aussehen,
%Vor% Sie können es dann im Interpreter testen ( file.txt
besteht nur aus drei Zeilen von Jibberish).
Grundsätzlich ist die Rückgabe eines C ++ - Objekts aus einer dynamisch geladenen Bibliothek keine gute Idee. Um C ++ vector
in Python-Code zu verwenden, müssen Sie Python beibringen, mit C ++ - Objekten umzugehen (und dazu gehört auch die binäre Darstellung der Objekte, die sich mit der neuen Version eines C ++ - Compilers oder einer STL ändern können).
ctypes
ermöglicht die Interaktion mit einer Bibliothek unter Verwendung von C-Typen. Nicht C ++.
Vielleicht ist das Problem über boost::python
lösbar, aber es scheint zuverlässiger zu sein, reines C für die Interaktion zu verwenden.