Python Script profiling

-AB-

R.I.P.
c-b Team
c-b Experte
#1
Hallo an alle,
erstmal: Brauchen wir ein Python-Subforum? Vermutlich eher als ein Delphi-Forum....

Zur Frage: Ich hab ein Script, was Bilder bearbeitet. Zuerst nur single threaded, hab es dann so umgeschrieben dass es erst eine Liste mit allen Bildern erstellt, diese auf X Listen aufteilt und dann dafür X Threads startet.

Bekomme aber, auch auf 40 CPU Kernen, keinen Speedup > 2 hin. Die einzelnen Threads sollten völlig unabhängig voneinander laufen, aber da es Python ist und ich keine Schlange bin, bin ich mir nicht sicher.

Könnte da mal jemand drüber schauen, und mir sagen woran es hängt? Hab es mal testweise mit einem Python-Profiler probiert, aber auch der konnte mir nicht wirklich helfen.

Script hat leider ein paar Abhängigkeiten (PIL, scipy, numpy, bidict) aber vielleicht erbarmt sich ja jemand, die schnell zu installieren. :)
Angehängt hier hochgeladen ist das Script mit 100 Testbildern, einfach downscaleImages.py aufrufen und schauen was passiert.
Ich sehe grad, es dauert mit mehreren Threads sogar länger:

Code:
ab@abdesktop64:~/Desktop/test$ time python downscaleImages.py
Skipping directory: merged_out
Skipping directory: target
Processing directory: testing
Skipping directory: coords
splitting up 100 files into 1 work chunks
joining in threads...
joined all threads.
out of 100 files, 100 converted. ( 0 skipped)
average pixel: [ 118.85727173  120.83241862  117.38582133  178.60829346]

real    1m55.131s
user    1m54.780s
sys    0m0.672s
ab@abdesktop64:~/Desktop/test$ time python downscaleImages.py
Skipping directory: merged_out
Skipping directory: target
Processing directory: testing
Skipping directory: coords
splitting up 100 files into 8 work chunks
joining in threads...
joined all threads.
out of 100 files, 100 converted. ( 0 skipped)
average pixel: [ 118.85727173  120.83241862  117.38582133  178.60829346]

real    4m16.021s
user    4m23.008s
sys    1m11.140s
Ist mir ein Rätsel.

Helft mir, Pythoniker!
 

-AB-

R.I.P.
c-b Team
c-b Experte
#3
*Hust* *würg* *spuck* Python!

War eigentlich zu erwarten bei einer Scriptsprache. Hatte damals nur kurz gesucht "synchronisiert Python eigentlich Zugriff auf Objekte" und in den ersten 3 Antworten nur "Eigentlich nicht" gefunden.

Von Thread zu Process umgeschrieben, tadaa:
Code:
out of 100 files, 100 converted. ( 0 skipped)
average pixel: [ 118.85727173  120.83241862  117.38582133  178.60829346]

real    0m28.610s
user    3m30.160s
sys    0m0.696s
Will ich ja fast gleich zum Spaß mal noch auf dem Xeon ausprobieren... aber auf dem läuft bis mindestens morgen früh noch was anderes. :)
 

-AB-

R.I.P.
c-b Team
c-b Experte
#4
Code:
out of 32608 files, 14167 converted. ( 18441 skipped)
real    10m7.241s
user    370m56.168s
sys     4m34.592s
Yeah, 10 Minuten statt ~10 Stunden. Danke nochmal :)
 
Oben