Seite 1 von 1

suche Modul für performante Matrizen und Matrix-Operationen

Verfasst: Montag 2. Februar 2009, 15:20
von Michael Schneider
Hallo Pythonfreunde und -freundinnen,

ich gehe gerade das auf http://www.pygame.org be- und von mir nun endlich erworbene Buch von Will McGugan durch und bin bei den Matrixoperationen angekommen.

Will stellt ein sehr umfangreiches Matrix-Objekt (Matrix44) auf seiner Website (http://www.willmcgugan.com/2007/05/20/g ... s-3d-math/) zur Verfügung.

Matrix44 Modul: http://www.willmcgugan.com/gameobjects/ ... odule.html

Es handelt sich aber um Python Code und ich frage mich, ob man nicht über ein kompiliertes Berechnungsmodul, das nur auf Matrizen zugeschnitten ist (also wenn möglich ohne NumPy und dergleichen) noch bessere Performance bei 3D-Spielen erreicht.

Kennt jemand von euch ein in Python importierbares Modul, das diese - oder zumindest die wichtigsten - Matrixberechnungen mit höchster Geschwindigkeit durchführen kann?

Viele Grüße,

der Michel

Re: suche Modul für performante Matrizen und Matrix-Operatio

Verfasst: Montag 2. Februar 2009, 15:50
von Leonidas
Michael Schneider hat geschrieben:Es handelt sich aber um Python Code und ich frage mich, ob man nicht über ein kompiliertes Berechnungsmodul, das nur auf Matrizen zugeschnitten ist (also wenn möglich ohne NumPy und dergleichen) noch bessere Performance bei 3D-Spielen erreicht.
Warum nicht NumPy?

Re: suche Modul für performante Matrizen und Matrix-Operatio

Verfasst: Montag 2. Februar 2009, 16:00
von Michael Schneider
Leonidas hat geschrieben:
Michael Schneider hat geschrieben:Es handelt sich aber um Python Code und ich frage mich, ob man nicht über ein kompiliertes Berechnungsmodul, das nur auf Matrizen zugeschnitten ist (also wenn möglich ohne NumPy und dergleichen) noch bessere Performance bei 3D-Spielen erreicht.
Warum nicht NumPy?
Weil es ein Umweg ist, den ich gern umgehen würde (einen Umweg umgehen...?). Wenn ich es benutzen muss, dann würde ich vermutlich SciPy für die Transformationen verwenden.

Michel

Verfasst: Montag 2. Februar 2009, 16:45
von Darii
Von welchem Umweg sprichst du?

Verfasst: Montag 2. Februar 2009, 17:31
von veers
Bei 3D Games wirst du über NumPy/SciPy früher oder später sowieso froh sein. Schnelles Arrays, Splines, optimierte Matrix Operationen usw.

- Jonas

Verfasst: Montag 2. Februar 2009, 18:32
von HerrHagen
Gerade für die Verwendung von PyGame ergeben sich für numpy sicherlich noch zahlreiche weitere Nutzeffekte(z.B. performant komplette Bilder erzeugen). Außerdem gibts da nicht so viel zu lernen. Das System ist wirklich sehr einfach und modular. Du musst dir eigentlich immer nur das anschauen was du brauchst. Der Einstieg gelingt sehr schnell.
Scipy ist eigentlich nur ne Sammlung von wissenschaftlichen Bibliotheken die auf numpy aufbauen. Für dein Problem ist da auch nicht wirklich viel dabei.
Du kannst dir natürlich immer überlegen ein eigenes-C-Modul für dein Problem zu schreiben. Das ist auch nicht soo schwierig wie ich anfangs dachte. Zumahl du ja schon eine Vorlage hast.

Verfasst: Montag 2. Februar 2009, 19:01
von Michael Schneider
Hallo,

erstmal vielen Dank für eure Anregungen. Insbesondere an die, die gemerkt haben, dass ich durch meine Angaben versuchte, eine Diskussion um die Verwendung von NumPy zu umgehen.
HerrHagen hat geschrieben:Du kannst dir natürlich immer überlegen ein eigenes-C-Modul für dein Problem zu schreiben. Das ist auch nicht soo schwierig wie ich anfangs dachte. Zumahl du ja schon eine Vorlage hast.
Ich dachte auch erst an eine Implementation in C oder gar Assembler und dass das schon jemand gemacht haben könnte, darum meine Frage hier. Soviel ich weiß kommt C bei heutigen Compilern an Assembler heran und ist natürlich weitaus einfacher kompilierbar.

Meine Grundidee war einfach, dass das Erzeugen der ganzen Objekte zur Repräsentation von Listen oder auch nur Zahlen, Unmengen an unnötigem Speicher und Rechenzeit kosten. Deshalb würde ich die Matrixdaten auch gar nicht so komplex halten und übergeben, sondern einfach als String oder mmap.
Meint ihr nicht, dass das die Performance erheblich verbessern würde?

Viele Grüße,

Michel

Verfasst: Montag 2. Februar 2009, 19:26
von HerrHagen
Ich dachte auch erst an eine Implementation in C oder gar Assembler und dass das schon jemand gemacht haben könnte, darum meine Frage hier. Soviel ich weiß kommt C bei heutigen Compilern an Assembler heran und ist natürlich weitaus einfacher kompilierbar.
Assembler brauch heute keiner mehr um Code schnellzubekommen. Wenn du es wirklich richtig übertreiben willst, musst du versuchen deine Operationen von der Grafikkarte durchführen zu lassen. Dann schau dir OpenGL oder DirectX an.
Meine Grundidee war einfach, dass das Erzeugen der ganzen Objekte zur Repräsentation von Listen oder auch nur Zahlen, Unmengen an unnötigem Speicher und Rechenzeit kosten. Deshalb würde ich die Matrixdaten auch gar nicht so komplex halten und übergeben, sondern einfach als String oder mmap.
Das macht numpy ja z.T. so. Du erzeugst zwar ein Array-Objekt z.B. aus ner Liste python-Int's, die Speicherung erfolgt intern aber als C oder Fortran Array. Die Operationen erfolgen dann entsprechend schnell auf diese Strukturen. Wenn du es schaffst möglichst wenig neue Objekte zu erzeugen und alle Operationen möglichst inplace durchführst, hast du kaum noch Overhead. Damit kannst du schon nah an eine reine C-Lösung kommen.
Meint ihr nicht, dass das die Performance erheblich verbessern würde?
ja.

Verfasst: Montag 2. Februar 2009, 19:32
von Darii
@Michael Schneider: Ich glaube du machst dir da viel zu viele Gedanken, da du Python verwendest hast du ganz andere Geschwindigkeits- und Speicherprobleme als ein paar sowieso schon hochoptimierte numpy-Arrays.

Verfasst: Dienstag 3. Februar 2009, 08:30
von CM
Eine Option ist auch die numpy-C-API zu nutzen. Die Matrix44 und Vector-Klasse sind ja schon sinnvoll, weil sie die gängigen abstrakten Funktionen (z. B. Anwendung einer Rotationsmatrix) vorgeben. Ich möchte wetten, dass so etwas unter Verwendung von numpy-Arrays schon schneller ist als die Vorgabe, aber falls das immer noch nicht aussreicht, so wäre ein Objekt - in C implementiert und von numpy.ndarray abgeleitet - so ziemlich das Einfachste und Schnellste, was machbar ist. (Natürlich wäre C 'from scrätsch' möglicherweise noch eine Spur schneller - aber zu welchem Preis?)

HTH
Christian