Python und CPU-Kernel

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
tklustig
User
Beiträge: 12
Registriert: Mittwoch 9. November 2016, 22:05

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.....
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.
tklustig
User
Beiträge: 12
Registriert: Mittwoch 9. November 2016, 22:05

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....
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.
tklustig
User
Beiträge: 12
Registriert: Mittwoch 9. November 2016, 22:05

Well, damit habe ich erstma' genug Anhaltspunkte zum Vertiefen.
Merci beaucopupour les informations,tu m'as donne....
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Eigentlich müsste der Interpreter lediglich OpenMP Pragmas verwenden um die Schleife zu parallelisieren.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@darktrym: Häh? Und damit verschwindet auf magische Weise das „global interpreter lock“ (GIL)? Das wäre ja schön…
Antworten