Seite 1 von 1

numpy mit c vs c++

Verfasst: Freitag 1. Mai 2020, 19:06
von NPC
Hallo Leute :),

ich will für eine Simulation einen Teil (den rechnerisch intensivsten) gerne in C bzw. C++ laufen lassen.
Und daher eine Python-Extension in C++ schreiben.
Dafür möchte ich auch numpy einbinden (ich muss während der Berechnung mehrfach auf ein numpy array zugreifen).
Sowei so gut. Prinzipiell läuft das, wenn ich in C bleibe. Wenn ich versuche das selbe in C++ zu machen, dann bekomme ich sehr viele Fehlermeldungen z.B:
Das Argument vom Typ ""PyObject *"" ist mit dem Parameter vom Typ ""PyArrayObject *"" inkompatibel.

oder auch

"PyObject *PyArray_GETITEM(const PyArrayObject *,const char *)" : Konvertierung von Argument 2 von "void *" in "const char *" nicht möglich"

Hier mal ein stück Code auf die sich die zweite Meldung bezieht:

Code: Alles auswählen

npy_intp ptr[2] = { y, x };
PyObject* dummy = PyArray_GETITEM(array2d, PyArray_GetPtr(array2d, ptr));
Ich nutze Visual Studio 2019 und hab da einfach die Projektvorlage zur Erweiterung von Python genutzt.
Der Grund warum ich c++ gerne nutzen würde statt c ist, dass ich gerne <random> nutzen würde um gleichverteilte Zufallszahlen zu bekommen.

Ich habe leider noch nicht allzu viel Erfahrung mit der Erweiterung in C/C++ und falls ihr (außer den beiden Dokus) noch sonstige gute Quellen habt nehme ich die auch gerne an :).

Sorry für den langen Text und schonmal danke im Vorraus :D

Re: numpy mit c vs c++

Verfasst: Freitag 1. Mai 2020, 19:50
von __deets__
C++ ist strenger was Typ-Pruefungen angeht. Darum laesst der Compiler (zumindest so wie er da konfiguriert ist) das nicht zu. Laut

https://github.com/numpy/numpy/blob/mas ... es.h#L1547

ist das ein const char* der da uebergeben werden muss. Auch wenn der dann gleich wieder in einen void* konvertiert wird, den du ja schon hast. Sieht ein bisschen kacke aus.

Wie dem auch sei: wenn du C++ benutzen willst, musst du an solchen Stellen eben tun, was C++ von dir verlangt. Also zB ein static_cast oder reinterpret_cast. In diesem Fall sollte ein static_cast ausreichen

Code: Alles auswählen

static_cast<const char*>(ptr)

Re: numpy mit c vs c++

Verfasst: Freitag 1. Mai 2020, 20:04
von NPC
Vielen Dank :).
Hat super funktioniert.

Jetzt fühle ich mich dumm.
Da hätte man ja selbst drauf kommen können :D .

Schönes Wochende dir

Re: numpy mit c vs c++

Verfasst: Freitag 1. Mai 2020, 20:31
von __deets__
Meh. C++ ist hart. Ich habe gestern geschlagene 20 Minuten, plus einen Hilferuf an die Kollegen, damit verbracht, einen Compiler Fehler wegen einem const zu viel hinterher zu jagen. So ist die Sprache halt.

Re: numpy mit c vs c++

Verfasst: Freitag 1. Mai 2020, 21:14
von Sirius3
Wer programmiert auch freiwillig in C++, wenn man doch schon Python hat? Wenn man Performance-Probleme hat, benutzt man numba.

Re: numpy mit c vs c++

Verfasst: Freitag 1. Mai 2020, 21:52
von __deets__
Vieles, aber nicht alles geht halt in Python. Echtzeitprogrammierung eben nicht. Das hat nur mittelbar mit Performance zu tun, sondern eher mit determinismus. Da ist C++ relevant. Ob der TE mit numba zum Ziel kommt, kann ja durchaus sein.

Und irgendwer muss ja auch die numpy & co Bibliotheken schreiben...

Re: numpy mit c vs c++

Verfasst: Freitag 1. Mai 2020, 22:20
von Sirius3
@__deets__: und irgendwer muß auch das Betriebssystem schreiben...
Der TE schreibt was von „rechenintensiv”. Echtzeit geht mit Windows eh nicht.

Re: numpy mit c vs c++

Verfasst: Samstag 2. Mai 2020, 11:06
von NPC
Hallo Sirius3,

ich kannte numba bis gerade eben tatsächlich nicht.
Habe es gerade eben mal an einer der Funktionen getestet...
Das funktioniert richtig gut.
Und der Funktionsumfang den ich beim überfliegen gesehen habe ist ja der Hammer!
Schade, dass ich erst jetzt davon höre aber auf jeden Fall vielen Dank für den Tipp :D .

Und euch beiden danke dafür, dass Ihr nochmal verschiedene Aspekte bzw. Vorteile gegenüber gestellt habt.
Werde Versuchen mich in Zukunft daran zu orientieren.