suche Modul für performante Matrizen und Matrix-Operationen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Montag 2. Februar 2009, 15:20

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 2. Februar 2009, 15:50

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?
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Montag 2. Februar 2009, 16:00

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Montag 2. Februar 2009, 16:45

Von welchem Umweg sprichst du?
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Montag 2. Februar 2009, 17:31

Bei 3D Games wirst du über NumPy/SciPy früher oder später sowieso froh sein. Schnelles Arrays, Splines, optimierte Matrix Operationen usw.

- Jonas
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Montag 2. Februar 2009, 18:32

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.
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Montag 2. Februar 2009, 19:01

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Montag 2. Februar 2009, 19:26

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.
Zuletzt geändert von HerrHagen am Montag 2. Februar 2009, 19:59, insgesamt 2-mal geändert.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Montag 2. Februar 2009, 19:32

@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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Dienstag 3. Februar 2009, 08:30

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
Antworten