ich versuche gerade einen meiner Prozesse zu beschleunigen, aber so wie ich mir das vorstellte, will das nicht so wirklich (wenn dem nicht so waere wuerde ich das hier natuerlich nicht posten... )
Ich habe eine lange Liste von Pfaden (aktuell ca. 7000, aber das kann auch laenger sein), die dann linear durchlaufen wird, um ein paar Operationen durchzufuehren (welche ist fuer diese Frage erstmal nebensaechlich). Das dauert viel, viel zu lange, weshalb ich mir dachte, ich koennte die Liste in viele Kleine aufspalten und diese Listen parallel durchlaufen lassen. Da ich ohne viel eigenes Wissen zu haben, viele gelesen habe, dass threading in Python wegen dem GIL (Global Interpreter Lock?) eher nicht das erwuenschte Ergebnis gibt, dachte ich an das multiprocessing modul, was ich vorher noch nicht benutzt habe.
Lange Rede, kurzer Sinn. Ich habe mir eine Uebungsfunktion zusammengeschustert, die einfach nur eine Liste von Integern nimmt und eine Liste wiedergibt, die alle Werte+1 wiedergibt. Leider ist meine multiprocessing benutzende Funktion um ein vielfaches langsamer als die linear funktionierende Version und ich frage mich wirklich warum. Den multiprocessing code, habe ich aus der offiziellen Dokumentation genommen . Die grouper function habe ich aus stack overflow.
Bin ich hier auf dem falschen Dampfer oder fehlt mir nur ein kleines Puzzleteil zu meinem Glueck? Danke schonmal fuer die Anregungen.
Code: Alles auswählen
from multiprocessing import Process
from itertools import izip_longest
from timeit import Timer
def grouper(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
return list(izip_longest(*args, fillvalue=fillvalue))
def plus_one(li):
new = []
for i in li:
if i == None:
pass
else:
new.append(i+1)
return new
def plus_one_multi(li, divider):
new = []
groups = grouper(li, divider)
for group in groups:
p = Process(target=plus_one, args=(group,))
new.append(p)
p.start()
p.join()
return new
def test():
r = xrange(20000)
plus_one_multi(r, 1000)
if __name__ == '__main__':
t = Timer("test()", "from __main__ import test")
print t.timeit(1000)
# simple plus_one took 4.62936496735 sec
# plus_one_multi took 45.3931000233 sec