Dual-Core // CPython, Jython, Ironpython

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
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

huhu!


Nach Tagelangem Kopfzerbrechen und Rumprobieren ist nun endlich mein Programm (auch Dank eurer Hilfe) fertig geworden.
Doch hätte ich es gerne etwas schneller...
Es braucht für einen Durchlauf ca. 30 Sekunden, da es einige aufwendige Vergleiche vornimmt. Pyhton benutzt nur einen meiner 2 Prozessorkerne... Wenn beide Kerne nun mein Programm bearbeiten würden, könnte man die Zeit ja etwas drücken.

Ich hatte mich dazu schon mal vor ner Woche oder so umgeschaut und festgestellt, dass das 1-Core-Problem Python historisch angeboren ist und hatte die Hoffnung auf eine Lösung schon aufgegeben. Doch eben grade habe ich das
http://groups.google.com/group/comp.lan ... eca5dd9ac/
gelesen und dort im Beitrag von sturlamolden im untenstehenden Zitat die Begriffe CPython, Jython und Ironpython gefunden, die wohl irgendwie mehrere Kerne unterstützen können.

Ich verwende hier auf dem Rechner Windows XP und hab nen Intel T7200 drin.

Ich habe mir mal Ironpython runtergeladen, komm damit aber nicht klar.
Die Konsole kann ich öffnen, doch will ich ja einfach mein schon geschriebenes Programm, das als .py-Datei vorliegt, mit Ironpython ausführen.

Oder ist vllt Cpython oder Jython besser geeignet?
Ich brauch nur ne Möglichkeit, mein Programm zu verschnellern, indem mein zweiter Kern mit eingebunden wird.


Gruß
Paul
On Aug 17, 6:00 pm, nikhilketkar <nikhilket...@gmail.com> wrote:

> What are the implications of the Global Interpreter Lock in Python ?

This is asked every second week or so.

The GIL is similar to the Big Kernel Lock (BKL) use to support SMPs in
older versions of the Linux kernel. The GIL prevents the Python
interpreter to be active in more than one thread at a time.

If you have a single CPU with a single core, the GIL has no
consequence what so ever.

If you have multiple CPUs and/or multiple cores, the GIL has the
consequence that you can forget about SMP scalability using Python
threads. SMP scalability require more fine grained object locking,
which is what the Java and .NET runtimes do, as well as current
versions of the Linux kernel. Note that IronPython and Jython use fine
grained locking instead of a GIL.

> Does this mean that Python threads cannot exploit a dual core
> processor and the only advantage of using threads is in that
> computation and IO-bound operations can continue in parallel ?

The Python standard library releases the GIL in read/write operations
for e.g. files and sockets. This can be combined with threads to allow
multiple IO operations to continue in parallel. The GIL has no or very
little significance for IO-bound scalability in Python.

CPU-bound tasks are a different game. This is where the GIL matter.
You must either release the GIL or use multiple processes for
exploiting multiple processors in an SMP computer with Python. The GIL
can be released explicitely in C extension code. f2py and ctypes can
also release the GIL.

Note that you would NOT use threads for speeding up CPU-bound
operations, even when programming in C or Fortran. Threads are neither
the only nor the preferred way to exploit multicore CPUs for CPU-bound
tasks. Instead of threads, use either an MPI library or OpenMP
compiler pragmas. You can use MPI directly from Python (e.g. mpi4py),
or you can use OpenMP pragmas in C or Fortran code which you call
using ctypes or f2py.

Summary:

Use Python threads if you need to run IO operations in parallel.
Do not use Python threads if you need to run computations in parallel.

Regards,
Sturla Molden
BlackJack

@Peak_me: CPython ist das in C geschriebene Python, welches man bei http://www.python.org/ bekommt, also das "normale" Python.

Bei IronPython müsstest Du etwas genauer werden, warum das mit dem starten Deines Programms nicht klappt. Man kann dem Interpretierer, genau wie dem "normalen" Python auch, einen Dateinamen geben und die Datei wird dann ausgeführt.

Weitere Kerne oder Prozessoren werden übrigens nicht automatisch verwendet, man muss das Programm dazu schon entsprechend parallelisiert schreiben.

Bei CPython würde ich erst einmal das `multiprocess`-Modul ins Auge fassen um ein Programm aus Geschwindigkeitsgründen zu parallelisieren.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

mal anders gefragt: Ist 30 Sekunden Laufzeit schlimm? Wenn du das Prog nur ab und laufen lässt ist das IMHO nicht weiter schlimm.

Aufgaben parallelisieren ist am Anfang nicht ganz trivial. Also das Konzept und Vorgehen richtig hinzubekommen, nicht unbedingt das Programmieren.

Plan B: Ein schnellerer Prozessor :D

Gruß, noisefloor
BlackJack

@noisefloor: Vor Plan B würde ich noch die Algorithmen/Datenstrukturen auf den Prüfstand stellen und eventuell mal ein bisschen Profiling betreiben wo denn die ganze Zeit bleibt.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@BlackJack: na ja - das kostet aber Zeit. Plan B nur Geld :lol:

In Anbetracht der Tatsache, dass die Single-Thread Performance der CPUs nicht mehr so rapide sollte man über deinen Vorschlag mal nachdenken. ;-)

@Peak_me: Für eine "reine" Rechenroutine sind 30s nicht ohne... Oder hast du viel I/O oder DB-Zugriffe? Haust du dir vielleicht den Speicher mit Riesen-Listen oder so zu und das System swappt?

Gruß, noisefloor
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

BlackJack hat geschrieben:@noisefloor: Vor Plan B würde ich noch die Algorithmen/Datenstrukturen auf den Prüfstand stellen und eventuell mal ein bisschen Profiling betreiben wo denn die ganze Zeit bleibt.
Das würde ich sogar schon vor Plan A (Parallelisierung) machen ;)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

Das Programm beschäftigt sich mit Verschlüsselung
Ich hab da was drüber gelesen und hatte nen paar gute Ideen und versuche nun, mit verschiedenen Modellen etwas rumzuspielen.

Ich codiere verschiedene Texte und versuche sie danach wieder zu entschlüsseln.
Um zu wissen, wo ich überhaupt ansetzen kann, muss ich die Texte erstmal durchsuchen... nach Auffälligkeiten oder Schwachstellen.
Dazu habe ich ein Programm geschrieben, bei dem ich je nach Bedarf einzelne Funktionen und Abschnitte abstellen, anstellen und verändern kann.
Dieses Vor-Programm brauche ich alle paar Sekunden:Mir fällt was neues ein, ich passe die Parameter an und muss das Programm erneut durchlaufen lassen. Hierbei sind Wartezeiten von bis zu 30 Sekunden nicht optimal.

Das Programm vergleicht den codierten Text mit verschiedenen Listen... zB mit Wortdateien aller europäischen Sprachen oder mit selbst erstellten Zahlenlisten und -Dateien
Alle dieser Dateien sind sehr groß und die Vergleiche sehr rechenaufwendig.
Ich habe mich schon auf bestimmte Verschlüsselungslängen beschränkt... Eigentlich brauchen die von mir benötigten Programme 10 Minuten oder länger zum Durchlaufen.

Bestimmt sind meine Scripte mehr als verbesserbar, denn ich kenne mich mit Python nur rudimentär aus.
Doch selbst wenn man die Durchlaufzeit durch Codeoptimierung um das Zehnfache beschleunigen könnte... Dann würde ich eben den Code eine Stelle länger machen und wir hätten wieder die gleiche Zeit :lol:

Wenn ich mit Python nicht alle meine Kerne benutzen kann, muss ich auf ne andere Programmiersprache umsteigen.
Mein Laptop hat ja nur zwei Kerne. Ich überlege, ob ich mir nen schönen Leistungsfähigen Tower-PC kaufe. Doch dessen 4 oder mehr Kerne könnte ich dann ja garnicht nutzen.

Mit dem Ironpython habe ich mich nur ganz Kurz beschäftigt. Ich habe mal flüchtig nach nen paar Tutorials im Internet gesucht, doch habe ich nicht rausgefunden, wie ich ein Script zum Laufen kriege, außer es in die Console einzutippen.
Gibt es da nicht sowas wie die Python-Programmierumgebung?
Wenn ich die .py-Datei mit Ironpython ausführen lasse, verschwindet das cmd-Fenster immer zu schnell, als dass ich den Error lesen könnte.

Ich werde mich wohl wohl oder übel mit dem multiprocess-Modul beschäftigen müssen.
Wenn ich den Gedanken davon richtig verstanden habe, werde ich wohl mein Programm in zwei Hälften zerlegen müssen:
Der eine Teil vergleicht den Text mit der ersten Hälfte der Datei, der andere Teil nimmt sich die zweite Hälfte vor.
Beide Teile laufen dann auf je als ein Prozess auf einem Kern und danach werden die Ergebnisse dann zusammengefügt.

Keine Ahnung, ob ich mein Programm derart zerlegen kann, da sehr viele Querbezüge innerhalb der Zwischenergebnisse, der Vergleichsdateien und der verschlüsselten Testtexte bestehen.
Aber ich kanns ja mal versuchen :)
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

Ich bin grade doch mal den Zeitschluckern auf die Spur gegangen.

In einem Programm verschlüssel ich Dinge in Bildern.
Um bestimmte Abschnitte zu bearbeiten, muss ich zB einen Abschnitt von 50 mal 50 Pixeln auslesen.
Das tue ich so:

Code: Alles auswählen

y=blub1
for h in range(50):
        y+=1
        x=blub2
        for g in range(50):
            x+=1
            pix=img.getpixel((x,y))
            if pix==bedingung:
                ...
                liste.append(a)
            else:
                ...
                liste.append(b)
Und das läuft dann einige Hundert Mal an verschiedenen Stellen durch.
Dieses eine Stück verbraucht ca. 40% der Laufzeit des Programms.

50 weitere Prozent gehen in:

Code: Alles auswählen

if a in b and a not in c:
            d.append(a)
            e.append(f)
Das hätte ich zB nicht gedacht... dass nur 50% in die eigentliche Berechnung gehen und 40% in reine vorbereitende Datensammlung.
Gibt es eine effizientere Möglichkeit, 50 mal 50 Pixel einer Bilddatei in eine Liste zu packen?
BlackJack

@Peak_me: Falls hier PIL verwendet wird, gibt es sicher effizientere Methoden um 50×50 Pixel auszuschneiden. Zum Beispiel die `crop()`-Methode. Und man kann sich die Daten dann auch als "flaches" Sequenzobjekt geben lassen.

Je nach dem was mit dem Bildausschnitt gemacht wird, könnte `numpy` eventuell nützlich sein.

Beim zweiten Schnippsel: Was sind `b` und `c` für Datentypen?
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

b und c sind Listen, die Wörter enthalten.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Peak_me hat geschrieben:b und c sind Listen, die Wörter enthalten.
Versuche diese mal durch Mengen zu ersetzen.
Das Leben ist wie ein Tennisball.
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

extrem cool!
wirklich!

Ich hatte noch nichts von Mengen in Python gehört, doch ein einfaches "b=set(b)" hat den Teil um mehr das Hundertfache beschleunigt. Die vorherigen 20 Sekunden sind jetzt auf etwas mehr als eine Zehntelsekunde zusammengeschrumpft.

Mal sehen, ob ich die Bilderkennung auch beschleunigen kann.
Antworten