performance problem

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
smashed to pieces
User
Beiträge: 38
Registriert: Samstag 24. November 2007, 16:50

Dienstag 21. April 2009, 20:25

Guten Abend,
mein Programm ist der Versucht eine Simulation eines elastischen Stoßes im idealen Gas mit Python nachzustellen. Das heißt, es besteht im Wesentlichen aus einer Klasse, welche eine Kugel mit den grundlegendsten Eigenschaften der Physik (Masse, Geschwindigkeit, Stoßlogik, usw.) ausstattet. An und für sich ist das auch nicht allzu schwierig, da ich keine großen Formeln aufstellte sondern den Computer einfach ständig kontrollieren lasse ob ein Stoß ausgeführt werden muss oder nicht. Dadurch entstehen natürlich Fehler, aber diese sind nicht das Problem, da diese ja durch meine Programmlogik "vorprogrammiert" sind.
Das Problem ist eher, das meine CPU-Auslastung schon ab drei Kugeln bei ca. 100% liegt.
Mein PC hat 2,4 Ghz, was bei weitem genug sein müsste und ich verwende Python 2.5 mit Tkinter unter Linux.
Bitte nicht über meine Namensgebung beschweren, ich weiß, dass sie nicht allzu gut ist. Vor allem da ich die Vektoren einfach mit Buchstaben Abgekürzt habe (so heißt zum Beispiel sM_bM(Vektor von self Mitte nach bullet Mitte) und _n(Normalvektor)). Da mir gerade aber keine gute Schreibweiße eingefällt, habe ich diesen Mangel noch nicht beseitigt. (Die Formel sollte aber so und so nicht der Problem sein!)

Irgendwelche Ideen welche das CPU Problem beseitigen könnten?
Verbesserungsvorschläge sind natürlich willkommen =), bin noch recht ein Anfänger =/.

Code: http://paste.pocoo.org/show/113621/


mfg smashed
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Dienstag 21. April 2009, 20:40

Hoi,

schönes Programm. Kann man durchaus vereinfachen (statt sympys evalf() aufzurufen kannst Du z. B. direkt mit numpy arbeiten, was schneller wäre -- sympy arbeitet ja auch mit numpy ist allerdings ein Layer drauf), müßte etwas aufgeräumt werden (was machen das 'global' da und was ist mit centralImpulse()?) und noch einige weitere Kleinigkeiten, aber daran will ich nicht weiter kritteln.

Zu Deiner Frage: Im Code steht nicht, dass der Rechner das Rechnen bleiben lassen soll. M.a.W. kein time.sleep() oder so. Der Rechner ist 100% beschäftigt und das wird er immer mit so einem Programm sein - egal wie leistungsfähig die CPU ist (jedenfalls bei Einfachkernen, bei Mehrfachkernen ist dann eben der eine wo es gerade drauf läuft entsprechend ausgelastet). Das ist doch nicht schlimm, oder? Wenn Du das Programm optimierst, wird die Simulation schneller laufen, aber die CPU-Auslastung ändert sich nicht. Ggf. wird die Simulation so schnell, dass Du sie künstlich bremsen mußt, weil Deine Augen, den Punkten sonst nicht folgen können ;-).

Gruß,
Christian
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Dienstag 21. April 2009, 21:34

Nach kurzem Überfliegen:
Die Logik Deines Programmablaufes ist
prinzipiell falsch (äh, ziemlich ungünstig...).

Du sagst in der Berechnungsschleife
(in Pseudocode):

Code: Alles auswählen

fuer alle bullets:
    berechne bullet und 
    zeichne immer wieder neu
    mit individuellem canvas.update() und
    canvas.after()
Stattdessen sollte es sein:

Code: Alles auswählen

solange kein programmabbruch:
    fuer alle bullets:
        berechne(bullet)
        zeichne(bullet)

    (nur einmal!)
    canvas.update()
canvas.update() und canvas.after() sollten nicht
von den Bullets aufgerufen werden.

Schau Dir mal mein Beispiel
http://paste.pocoo.org/show/91141/
(verwendet keine mainloop!)
aus dem Thread
http://www.python-forum.de/post-116169.html#116169
an.

Mit dieser Logik sollte es wesentlich
schneller laufen.
:wink:
yipyip
smashed to pieces
User
Beiträge: 38
Registriert: Samstag 24. November 2007, 16:50

Mittwoch 22. April 2009, 13:06

CM hat geschrieben:Im Code steht nicht, dass der Rechner das Rechnen bleiben lassen soll. M.a.W. kein time.sleep() oder so. Der Rechner ist 100% beschäftigt und das wird er immer mit so einem Programm sein - egal wie leistungsfähig die CPU ist
Nach meinem Verständnis brauche ich kein time.sleep() in meinem Code, da ich ja after() verwende und mir somit auch gleich sämtliche Threads erspare, welche man so oder so nicht gut mit Tkinter kombinieren kann. Hab ich die Methode grundsätzlich falsch verstanden oO ?


@ yipyip: danke für den Tipp und das Beispiel, hört sich soweit logisch an.


Und.. Ist iPython wirklich schneller?

mfg
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Mittwoch 22. April 2009, 13:16

smashed to pieces hat geschrieben:Und.. Ist iPython wirklich schneller?
Solang wir von demselben ipython reden, ist es nur eine - massiv - aufgebohrte interaktive Shell. darum wird sie allenfalls genauso schnell, wenn nicht langsamer sein, aber um Code laufen zu lassen ist das irrelevant.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Mittwoch 22. April 2009, 13:49

smashed to pieces hat geschrieben:
CM hat geschrieben:Im Code steht nicht, dass der Rechner das Rechnen bleiben lassen soll. M.a.W. kein time.sleep() oder so. Der Rechner ist 100% beschäftigt und das wird er immer mit so einem Programm sein - egal wie leistungsfähig die CPU ist
Nach meinem Verständnis brauche ich kein time.sleep() in meinem Code, da ich ja after() verwende und mir somit auch gleich sämtliche Threads erspare, welche man so oder so nicht gut mit Tkinter kombinieren kann. Hab ich die Methode grundsätzlich falsch verstanden oO ?
Nein, keine Sorge. Was ist meine ist lediglich, dass man mit time.sleep() lediglich provozieren kann, dass der Prozessor ein Nickerchen machen kann, er ansonsten bei Deinem Programm arbeiten wird. ;-) Mit Tkinter kenne ich mich nicht aus - aber was yipyip sagt, kann ich nur unterstreichen.

Und was ipython angeht: Wie kommst Du darauf? Hat das wer behauptet?

Gruß,
Christian
Antworten