schnelle Vektor Klasse in C

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Leonard
User
Beiträge: 15
Registriert: Freitag 26. Dezember 2008, 15:01

Hi
Ich bin dabei einen PathTracer zu programmieren, doch schon jetzt ist die Rendergeschwindigkeit mehr schlecht als recht! Daher möchte ich meine zentrale Klasse Vektor (3D) so schnell wie möglich machen.

Ich habe bis jetzt vergebens nach einem Vektor Modul, das auf C basiert gesucht und habe bereits Cython probiert. Der Vektor, denn ich mit Cython erstellt habe arbeitet zwar schon deutlich schneller als pures Python, doch die Tatsache, dass eine kleine Klasse zu einem 25kb großem PYD-Modul wird (2500 zeilige C-Datei) macht deutlich, dass mit Sicherheit noch mehr Geschwindigkeitszuwachs möglich ist

könnt ihr mir helfen? gibt es gute Tutorials für das Erstellen von neuen Datentypen in C?

Vielen Dank
Leo

Hier meine Vektor Klasse:

Code: Alles auswählen

from math import sqrt

class Vektor(object):
    __slots__ = ("x","y","z")
    def __init__(self,x,y,z):
        self.x = x
        self.y = y
        self.z = z

    def __str__(self):
        return "(%s,%s,%s)" % (self.x,self.y,self.z)
    def __abs__(self):
        return float(sqrt(self.x**2+self.y**2+self.z**2))
    
    def __add__(self,pVektor):
        return Vektor(self.x+pVektor.x,self.y+pVektor.y,self.z+pVektor.z)
    def __pos__(self):
        return self
    def __sub__(self,pVektor):
        return Vektor(self.x-pVektor.x,self.y-pVektor.y,self.z-pVektor.z)
[...]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Ich würde es zunächst mit Psycho versuchen. Wenn das nichts hilft numpy und erst dann eine Auslagerung versuchen. Du solltest aber auch bedenken, dass eine Auslagerung immer Overhead mit sich bringt. Nur die primitiven Operationen in eigenen exteren Modulen werden nicht unbedingt den gewünschten Effekt haben.

Sebastian
Das Leben ist wie ein Tennisball.
Leonard
User
Beiträge: 15
Registriert: Freitag 26. Dezember 2008, 15:01

Hab ich vergessen zu sagen:
Psycho und Numpy habe ich bereits getestet! Numpy ist von allen Varianten die langsamste und pcycho reicht auch nicht an mein mit Cython erstelltes C Modul, das ich verbessern möchte, heran.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Natürlich noch der Link zum Erstellen von C-Modulen. Das erste Beispiel ist eigentilch sehr umfangreich und sollte als Einstieg genügen.

Sebastian
Das Leben ist wie ein Tennisball.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Hast du mal einen Profiler laufen lassen, um zu evaluieren, ob das Vektor-Gerechne denn überhaupt relevant für die Geschwindigkeit ist? Es macht doch gar keinen Sinn, sich da jetzt groß mit C rumzuschlagen, wenn die Optimierung gar nichts bringt.
Leonard
User
Beiträge: 15
Registriert: Freitag 26. Dezember 2008, 15:01

Tatsache ist, dass das Cython Vektor Modul sparsamer mit dem Arbeitsspeicher umgeht und das will ich gerne weiter ausbauen.

Ich habe versucht in einem ersten Schritt das erste Beispiel der Python Dokumentation nachzubauen:
http://docs.python.org/py3k/extending/newtypes.html

Doch schon daran scheitere ich:

Jedes mal, wenn ich versuche die C-Datei zu kompilieren bekomme ich Errors:

Code: Alles auswählen

C:\Programme\Python26\python.exe setup.py build

Code: Alles auswählen

C:\Dokumente und Einstellungen\user\Desktop\n>C:\Programme\Python26\py
thon.exe setup.py build
running build
running build_ext
building 'noddy2' extension
c:\MinGW\bin\gcc.exe -mno-cygwin -mdll -O -Wall -IC:\Programme\Python26\include
-IC:\Programme\Python26\PC -c noddy2.c -o build\temp.win32-2.6\Release\noddy2.o
noddy2.c:167: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'no
ddy2module'
noddy2.c: In function 'PyInit_noddy2':
noddy2.c:181: warning: 'return' with a value, in function returning void
noddy2.c:183: warning: implicit declaration of function 'PyModule_Create'
noddy2.c:183: error: 'noddy2module' undeclared (first use in this function)
noddy2.c:183: error: (Each undeclared identifier is reported only once
noddy2.c:183: error: for each function it appears in.)
noddy2.c:183: warning: assignment makes pointer from integer without a cast
noddy2.c:185: warning: 'return' with a value, in function returning void
noddy2.c:189: warning: 'return' with a value, in function returning void
error: command 'gcc' failed with exit status 1
Kann mir jemand verraten, weshalb nicht einmal das Beispiel funktioniert? (ich nutze Python2.6, aber das sollte doch egal sein!?)
BlackJack

@Leonard: Also erst einmal kann es durchaus sein, dass sich die API geändert hat.

Aber schau Dir doch nochmal die Fehlermeldung an, insobesondere den Teil hier:

Code: Alles auswählen

noddy2.c:167: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'no
ddy2module'
Das sieht so aus, als hättest Du mitten in einem Bezeichner einen Zeilenumbruch gesetzt!?
Leonard
User
Beiträge: 15
Registriert: Freitag 26. Dezember 2008, 15:01

@BlackJack: So lautet der Code, laut der Dokumentation. Ist das falsch?

Code: Alles auswählen

static PyModuleDef noddymodule = {
    PyModuleDef_HEAD_INIT,
    "noddy",
    "Example module that creates an extension type.",
    -1,
    NULL, NULL, NULL, NULL, NULL
};
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Richtige C-Header eingebunden in die Datei?
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

In der Doku für 2.6 steht an der Stelle aber

Code: Alles auswählen

static PyMethodDef noddy_methods[] = {
    {NULL}  /* Sentinel */
};
Die Beispiele sind verschieden, ich verstehe auch nicht, warum du bei py3k schaust, wenn du 2.6 verwendest :K
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

frabron, `PyModuleDef` != `PyMethodDef`
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Ja, schon. Ich wollte auch darauf hinweisen, dass das Beispiel für 2.6 nicht gleich dem Beispiel für 3000 ist, welches der OP benutzt, obwohl seine Pythonversion 2.6 ist. Im Beispiel für 2.6 taucht "PyModuleDef" überhaupt nicht auf! Schau mal auf den Link der Dokumentation, die er verlinkt hat:
Ich habe versucht in einem ersten Schritt das erste Beispiel der Python Dokumentation nachzubauen:
http://docs.python.org/py3k/extending/newtypes.html
und
C:\Dokumente und Einstellungen\user\Desktop\n>C:\Programme\Python26\py
Dit passt net :)
(ich nutze Python2.6, aber das sollte doch egal sein!?)
Deshalb: Ist nicht egal ...
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Ich würde ernsthaft die Idee vielleicht mit Python ausprobieren (wenn überhaupt) und wenn alles klappt in C/C++ schreiben.
Meiner Meinung nach ist Python dafür nicht das Optimale Werkzeug.

lg
Antworten