Python Script mit 100% CPU Load ausführen?

6 Antworten

Dein Algorithmus muss parallelisierbar sein, dann geht das auch mit Python. Vermutlich nutzt du eine Art Sieb und die sind nicht sonderlich gut parallelisierbar.

Außerdem ist Python für diese Aufgabe denkbar ungeeignet. In C++ brauche ich für 2 Mrd. Primzahlen ca. 10 Sekunden bei 2.8 GHz auf einem einzigen Kern eines Haswells. Da ich eine Art Atkin-Sieb benutze lässt sich das auch nicht gut parallelisieren.

Andere Algorithmen dürften langsamer sein, vor allem wenn sie paralellisierbar sein sollen, aber wenn man dann natürlich auf 32 Kernen gleichzeitig rechnen kann, macht es diesen Nachteil natürlich locker wieder gut.

Merke: Wenn du willst, dass alle Kerne an dem Problem arbeiten, kommst du nicht drum herum, deinen Algorithmus grundlegend zu ändern.

Viel Spaß noch mit deinem Programm! :)

PS: Falls du doch bei Python bleiben willst, vergiss das multithreading Modul, denn wegen des GIL wirst du dabei nicht wirklich parallel arbeiten können. Entscheide dich stattdessen für das multiprocessing-Modul!

Die Synchronisation von Prozessen ist zwar unvergleichlich teurer als von leichten Threads mit geteiltem Speicher, aber das hängt ja sowieso von deinem Algorithmus ab, ob und wieviel du synchronisieren musst.

Sei dir aber im Klaren darüber, dass das Ganze keine einfache Aufgabe wird!

#multithreading ist nur die frage obs tatsächlich sinn hat bzw dann solltest du die threads begrenzen das keine arbeit doppelt verrichtet wird

Das Operation System verwaltet selber die Nutzung der Ressourcen und in der Regel sowohl Windows als auch Linux tut das ganz gut. Man kann mehr Ressourcen für ein Prozess reservieren bzw zuweisen, ob sie aber tatsächlich benutzt werden, ist natürlich ein anderes Thema (in der Regel nicht).

So wie ich deine Frage verstehe, erhoffst du dir eine bessere Performance. Python ist eine multi-core CPU Sprache aber in deinem Fall wird sehr wahrscheinlich nur 1 Core benutzt (25% - 1 von 4 nehme ich an)

Ich gehe davon aus, dass du numpy im Einsatz hast. numpy soll mut einer multithreading ATLAS library kompiliert sein. Du kannst auch andere Extensions wie z.B. numexpr, parallel python, corepy or Copenhagen Vector Byte Code einsetzen. 

   

Ich nehme an du nutze einen von vier Kernen voll aus. Das kann man nicht umstellen - das Skript nutzt was zur Verfügung steht. Wenn du mehrere Kerne nutzen möchtest, dann musst du das auch so programmieren..

Woher ich das weiß:Studium / Ausbildung – Informatikstudium

Wenn du Deinen Algorithmus nicht für mehrere Prozessoren gestrickt hast, wie soll Python dann wissen, was es sinnvoll mit den offenen Ressourcen machen soll? Das musst DU !