Seite 1 von 1
Python und CPU-Kernel
Verfasst: Mittwoch 9. November 2016, 22:13
von tklustig
Hallo Leute, bin absoluter Python-Neuling. Da dem so ist, ging ich,wie in allen anderen Programmiersprachen vor und testete die Rechengeschwindigkeit von Python. Benutzte dabei folgendes triviales Skript:
Code: Alles auswählen
n=input(n)
n=int(n)
for a in range (1,n):
for b in range (1,n):
c=a*b
if (c>=100*100)
print ("Grenze erreicht")
print(a,b,c)
Dass fur n->+00 die Bearbeitungszeit ebenfalls gegen +00 strebt, ist soweit klar.
Nicht klar hingegen ist,warum nur ein CPU-Kernel angesprochen wird.
Gibt es in Python Möglichkeiten, alle 4 Kernel anzusprechen?
Betreibe, diese Info ist höchstwahrscheinlich essentiel, LINUX unter einer VM.
Vorab vielen Dank ob jedwelchen feedbacks.....
Re: Python und CPU-Kernel
Verfasst: Mittwoch 9. November 2016, 23:05
von BlackJack
@tklustig: CPython benutzt für die Ausführung von Python-Bytecode nur einen Thread. Du müsstest das Programm also schon auf mehrere Prozesse aufteilen. Wobei das `multiprocessing`-Modul oder `concurrent.futures` hilfreich sein können.
Allerdings verstehe ich nicht das Du nicht verstehst das nur ein Kern ausgelastet wird bei *dem* Code‽ In welchen Programmiersprachen wäre das denn anders?
Da wird im übrigen auch nicht die Rechengeschwindigkeit von Python getestet sondern eher die des Terminals in dem das läuft, wegen der ganzen Ausgaben.
Re: Python und CPU-Kernel
Verfasst: Mittwoch 9. November 2016, 23:36
von tklustig
In VB.Net - beispielsweise - kann ich mittels
Code: Alles auswählen
Dim neuerthread As System.Threading.Thread||
neuerthread = New System.Threading.Thread(AddressOf Me.LangerVorgang)
neuerthread.Start()
relativ problemlos verschiedene Aufgaben den jeweiligen CPU's "zum Frass vorwerfen".
Klar, dass bei
dem Code nur ein Kern belastet wird.
Deswegen meine Frage, wie man Aufgaben in Python auf verschiedene Kerne verteilt....
Re: Python und CPU-Kernel
Verfasst: Donnerstag 10. November 2016, 01:04
von BlackJack
@tklustig: Wie gesagt, Prozesse, also kein gemeinsamer Adressraum, und `multiprocessing` oder `concurrent.futures` für solche ”kleineren” Aufgaben. Wenn man potentiell auch über mehr als einen Rechner skalieren will, gäb's beispielsweise Celery und Python Remote Objects.
Edit:
Code: Alles auswählen
import multiprocessing
# ...
process = multiprocessing.Process(target=langer_vorgang)
process.start()
# ...
Wobei man in Python dann wahrscheinlich eher einen `multiprocessing.Pool` erstellen würde, der sich dann automatisch um die Processe kümmert und vor allem auch das nicht zu viele auf einmal laufen.
Oder einen `concurrent.futures.ProcessPoolExecutor`. Je nach dem welche API besser zu dem Problem passt, welches man lösen möchte.
Re: Python und CPU-Kernel
Verfasst: Donnerstag 10. November 2016, 20:36
von tklustig
Well, damit habe ich erstma' genug Anhaltspunkte zum Vertiefen.
Merci beaucopupour les informations,tu m'as donne....
Re: Python und CPU-Kernel
Verfasst: Donnerstag 10. November 2016, 23:34
von darktrym
Eigentlich müsste der Interpreter lediglich OpenMP Pragmas verwenden um die Schleife zu parallelisieren.
Re: Python und CPU-Kernel
Verfasst: Donnerstag 10. November 2016, 23:55
von BlackJack
@darktrym: Häh? Und damit verschwindet auf magische Weise das „global interpreter lock“ (GIL)? Das wäre ja schön…