Wie behandelt man C ++ return type std :: vectorint in Python ctypes?

9

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%     
PascalVKooten 02.06.2013, 17:25
quelle

3 Antworten

6
  

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%     
Aya 02.06.2013, 20:29
quelle
11

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.

C ++

%Vor%

Kompilieren Sie es als eine gemeinsame Bibliothek. Unter Mac OS X könnte dies aussehen,

%Vor%

Python

%Vor%

Sie können es dann im Interpreter testen ( file.txt besteht nur aus drei Zeilen von Jibberish).

%Vor%     
Jared 02.06.2013 21:23
quelle
3

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.

    
Inspired 02.06.2013 17:36
quelle

Tags und Links