Seite 1 von 1
schnelle Vektor Klasse in C
Verfasst: Montag 31. Mai 2010, 09:40
von Leonard
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)
[...]
Re: schnelle Vektor Klasse in C
Verfasst: Montag 31. Mai 2010, 09:59
von EyDu
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
Re: schnelle Vektor Klasse in C
Verfasst: Montag 31. Mai 2010, 10:16
von Leonard
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.
Re: schnelle Vektor Klasse in C
Verfasst: Montag 31. Mai 2010, 10:25
von EyDu
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
Re: schnelle Vektor Klasse in C
Verfasst: Montag 31. Mai 2010, 21:27
von Dauerbaustelle
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.
Re: schnelle Vektor Klasse in C
Verfasst: Dienstag 1. Juni 2010, 12:13
von Leonard
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:\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!?)
Re: schnelle Vektor Klasse in C
Verfasst: Dienstag 1. Juni 2010, 12:21
von 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!?
Re: schnelle Vektor Klasse in C
Verfasst: Dienstag 1. Juni 2010, 12:58
von Leonard
@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
};
Re: schnelle Vektor Klasse in C
Verfasst: Dienstag 1. Juni 2010, 15:12
von Dauerbaustelle
Richtige C-Header eingebunden in die Datei?
Re: schnelle Vektor Klasse in C
Verfasst: Dienstag 1. Juni 2010, 15:53
von frabron
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
Re: schnelle Vektor Klasse in C
Verfasst: Dienstag 1. Juni 2010, 15:59
von Dauerbaustelle
frabron, `PyModuleDef` != `PyMethodDef`
Re: schnelle Vektor Klasse in C
Verfasst: Mittwoch 2. Juni 2010, 07:07
von frabron
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 ...
Re: schnelle Vektor Klasse in C
Verfasst: Montag 11. Oktober 2010, 03:07
von thelittlebug
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