Python Langsam - Keine PC Leistung?
Hi Leute, Ich hab ein Python Script welches viele Millionen Berechnungen machen muss..... Mein (einigermaßen guter) Computer läuft allerdings während das Script läuft nicht Geforderter als sonst und meine Berechnung Dauert Ewig (es sind vill. 1-4 % der CPU damit beschäftigt). Ich möchte aber, dass er bis zu 90% nutzt....
Ich möchte also meinem Computer vorschreiben wie Schnell/ausgelastet(in %) er läuft...
3 Antworten
Was der Grund dafür ist, dass nur 1 % bis 4 % deiner CPU ausgelastet werden kann ich dir nicht sagen.
Aber ich weiß aus persönlicher Erfahrung, dass Python langsam ist, was Berechnungen angeht, was einer der Gründe ist, warum ich schnell das Interesse an Python verloren hatte, aber nicht der einzige.
Nimm lieber Cython statt Python.
Das weiß ich nicht, sorry.
Vielleicht hast du hier eine höhere Chance auf eine hilfreiche Antwort :
Simple Berechnungen brauchen nunmal wenig CPU. Du führst diese Dinge ja hintereinander aus, weswegen er nicht auf die gesamte Prozessorleistung zurückgreift. Das ist so, als würdest du in einem Taschenrechner ständig eine Summe bilden und wieder löschen. Das lastet den Rechner auch nicht aus, dauert aber lange.
Ich sehe verschiedene Möglichkeiten um die Addition zu beschleunigen:
a) Du verwendest Multi-Threading, was in Python gar nicht so schwer umzusetzen ist. Dann kannst du deinen Datensatz in 4 Teile aufteilen und beschäftigst je einen Kern mit einem Viertel deiner Daten. Oft ist aber das Ergebnis von Multi-Threading nicht so viel schneller, wie man es sich erhofft.
b) du machst aus einem linearen Problem ein Array-Problem. Wenn du z.B. 1.000.000 Integer mit 1.000.000 anderen Integers addieren willst, ist ein Loop bedeutend langsamer, als wenn du numpy verwendest.
Code-Beispiele für eine Addition von a als [0, 1, 2, 3, ...., 1.000.000] und b [0, 2, 4, 6, ...., 2.000.000]
Version A - klassisches For-Loopa = range(0, 1000000, 1)
b = range(0, 2000000, 2)
c = []
for i in range(len(a)):
c.append(a[i] + b[i])
>> Dauer: 0.23 Sekunden
Version B - List-Comprehensiona = range(0, 1000000, 1)
b = range(0, 2000000, 2)
c = [a[i] + b[i] for i in range(len(a))]
>> Dauer: 0.16 Sekunden
Version C - Numpy-Array-Additionimport numpy
a = numpy.arange(0, 1000000, 1)
b = numpy.arange(0, 2000000, 2)
c = a + b
>> Dauer: 0.002 Sekunden
wie sieht denn das Script aus?
wenn es irgendwie möglich ist mir das schicken...
Da steht schlicht und simpel nur drin, dass zwei Wert addiert werden, dass das Ergebnis geprüft und ggf. zurück gesetzt wird
Und anderen Systemen(C++/C#/Java) läuft es erstaunlicher weise genau so schnell.... Kann man irgendwie Mehrkernmodus oder so aktivieren?