numpy ist mit PyPy aber noch etwas wackelig.jens hat geschrieben:schon mal über pypy nachgedacht?
Parallelprogrammierung?
PyPy sagt mir auch ehrlich gesagt nicht.
Ich hab da noch ne Frage. Habt ihr eine Idee wie ich eine Statusbar oder sowas in das parallele einbauen kann? Das einzige was mir einfällt ist anhand der aktuellen x y Koordinate und der Gesamtzahl der Pixel zu ermitteln wie weit man in dem Bild ist, allerdings ist das sehr ungenau da einige Pixel schneller als die anderen fertig sind.
Hier wärs wieder von Vorteil wenn jeder Thread auf eine globale Varibale zugreifen könnte. Könnte einfach an das Ende der Berechnungsfunktion die globale Varibale erhöhen bzw. auslesen und würde dann wissen wieviele Pixel wirklich fertig bearbeitet sind.
Ich hab da noch ne Frage. Habt ihr eine Idee wie ich eine Statusbar oder sowas in das parallele einbauen kann? Das einzige was mir einfällt ist anhand der aktuellen x y Koordinate und der Gesamtzahl der Pixel zu ermitteln wie weit man in dem Bild ist, allerdings ist das sehr ungenau da einige Pixel schneller als die anderen fertig sind.
Hier wärs wieder von Vorteil wenn jeder Thread auf eine globale Varibale zugreifen könnte. Könnte einfach an das Ende der Berechnungsfunktion die globale Varibale erhöhen bzw. auslesen und würde dann wissen wieviele Pixel wirklich fertig bearbeitet sind.
Es gibt ja bekanntlich(?) unterschiedliche Implementierungen von Python. Das von dir verwendete CPython kann als Referenzimplementierung betrachtet werden. PyPyist eine der Alternativen mit einem Fokus auf Performance.Arp hat geschrieben:PyPy sagt mir auch ehrlich gesagt nicht.
Ich denke PyPy wäre zumindest einen Versuch wert. Auch wenn numpypy noch nicht fertig ist, kann man es ja mal ausprobieren.
Solange du keine Funktionalität brauchst die hier aufgelistet ist, könnte es gehen: http://buildbot.pypy.org/numpy-status/latest.html
Solange du keine Funktionalität brauchst die hier aufgelistet ist, könnte es gehen: http://buildbot.pypy.org/numpy-status/latest.html
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
http://wiki.python.de/PyPyArp hat geschrieben:PyPy sagt mir auch ehrlich gesagt nicht.
Es ist in manchen Disziplinen um einiges schneller, siehe: http://speed.pypy.org/
Du meinst einen Fortschrittsbalken? Ich denke nicht, dass der sehr genau sein muss. Du willst ja nur wissen wo ungefähr er gerade ist.Arp hat geschrieben:PyPy sagt mir auch ehrlich gesagt nicht.
Ich hab da noch ne Frage. Habt ihr eine Idee wie ich eine Statusbar oder sowas in das parallele einbauen kann? Das einzige was mir einfällt ist anhand der aktuellen x y Koordinate und der Gesamtzahl der Pixel zu ermitteln wie weit man in dem Bild ist, allerdings ist das sehr ungenau da einige Pixel schneller als die anderen fertig sind.
Hier wärs wieder von Vorteil wenn jeder Thread auf eine globale Varibale zugreifen könnte. Könnte einfach an das Ende der Berechnungsfunktion die globale Varibale erhöhen bzw. auslesen und würde dann wissen wieviele Pixel wirklich fertig bearbeitet sind.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]

Naja, aber sollte ja nun prinzipiell nicht schwer sein abzuzählen wieviele Prozesse durchgelaufen sind.
Ich hab da was mit multiprocessing.Value gefunde, aber das klappt nicht ganz.
Hab mir dafür ein kleines Testprogramm geschrieben:
Code: Alles auswählen
from multiprocessing import Pool, Value
import numpy,time
def calc(sleeptime,n):
time.sleep(sleeptime)
n.value+=1
print str(n.value)+' Processes done.'
return sleeptime
randtimes = numpy.random.randint(10,size=100)
p = Pool(2)
n = Value('i',0)
result = p.map(calc,randtimes,n)
Aber was kriege ist nur eine Fehlermeldung.
unsupported operand type(s) for //: 'int' and 'Synchronized'
Das scheint irgendwie an der Übergabe von n zu liegen. Geht das vielleicht mit p.map nicht?
Übrigens, wenn dem Pool kein Argument für die Prozesszahl mitgegeben wird, dann ermittelt er diese Anzahl automatisch aus der Anzahl an Prozessorkernen. Das könnte unter Umständen portabler sein. Außer, es gibt berechtigte Gründe, die dagegen sprechen...
Und was dein Problem angeht: Das dritte (optionale) ist ja die `chunksize`. Da wird wohl eher ein normalen `Int`-Objekt erwartet.
Und was dein Problem angeht: Das dritte (optionale) ist ja die `chunksize`. Da wird wohl eher ein normalen `Int`-Objekt erwartet.
Zuletzt geändert von snafu am Dienstag 26. Juni 2012, 13:26, insgesamt 1-mal geändert.
Das Programm läuft auf einem Rechner den mehre Kollegen mitbenutzen. Ich will denen nicht gleich alle verfügbaren Kerne "wegnehmen" 
Nee, ich habs grad gesehen, das Problem war, das es p.map(calc,(randtimes,n)) sein muss. Die Argumente müssen quasi zusammen übergeben werden.
Aber dann kommt ein anderer Fehler.
Synchronized objects should only be shared between processes through inheritance
Wenn das so weiter geht, speicher ich fertige pixelnummern in einer Datei und lade es jedes mal wieder... wär sowas wie eine Globale Variable, nur extrem langsam da ständig von der Platte geladen werden muss

Nee, ich habs grad gesehen, das Problem war, das es p.map(calc,(randtimes,n)) sein muss. Die Argumente müssen quasi zusammen übergeben werden.
Aber dann kommt ein anderer Fehler.
Synchronized objects should only be shared between processes through inheritance
Wenn das so weiter geht, speicher ich fertige pixelnummern in einer Datei und lade es jedes mal wieder... wär sowas wie eine Globale Variable, nur extrem langsam da ständig von der Platte geladen werden muss

Ok, ich hab eine Lösung, aber die ist etwas blöd.
Und zwar scheint das relativ einfach zu gehen wenn man statt pool multiprocessing.Process benutzt.... kann ich darauf auch map anwenden?
Also ursprünglich stand da ja result = p.map(...). Allergebnisse aller Prozesse wurden nun in result gespeichert, wohl geordnet.
Kann ich das auch mit Process machen?
Und zwar scheint das relativ einfach zu gehen wenn man statt pool multiprocessing.Process benutzt.... kann ich darauf auch map anwenden?
Also ursprünglich stand da ja result = p.map(...). Allergebnisse aller Prozesse wurden nun in result gespeichert, wohl geordnet.
Kann ich das auch mit Process machen?
Aber hast du mal Lust PyPy auszuprobieren? Es könnte nochmal für einen Performanceschub sorgen.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]