Hallo Leute,
für meine Bachelorarbeit habe ich ein Programm geschrieben, welches einige Emails einliest, Zeilen daraus extrahiert und dann mit diesen diverse Berechnungen anstellt:
Die Funktion, die ich übergebe habe ich allerdings noch nicht optimiert (ich kenne die perfekten Parameter noch nicht) - Daher möchte ich den ganzen Vorgang mit verschiedenen Parametern durchführen lassen und ein Ergebnis zwischenspeichern, welches mir angibt, welche Parameter zu welcher Abweichung geführt haben. Diese Abweichung bestimmt sich aus der oben bestimmten Differenz zum Quadrat.
Da Python bei mir lediglich einen Kern nutzt und maximal 18% CPU-Last erreicht, habe ich nun an Multi-Threading gedacht.
Mit meinem Code werden allerdings lediglich mehrere Threads ausgeführt, nutzen aber weiterhin max. 18% CPU.
Vielleicht kann mir jemand einen offensichtlichen Fehler aufzeigen?
[src=python]import numpy as np
from main3 import mainFunc as mF
#import thread
from multiprocessing.dummy import Pool as ThreadPool
import traceback
def C1(distance, a = 1000000, b = 20):
if distance <= a:
#return b*(1.5*(distance/a - 0.5*(distance/a)**3))
#return b*(np.exp((-3*(distance/a)/10)))
return b*(np.exp((-0.1*(distance/a))))
#return b*np.exp((-3*(distance/a)/11))
#return b*np.exp(-0.05*(distance/a))
#return b*np.exp(-0.01*(distance/a))
#return b*(pow(1.1, -5*(distance/a)))
#return b*np.exp(-0.005*(distance/a))
#return b*np.exp(-0.05*np.sqrt((distance/a)))
else:
return b
def mainFunc1(list1):
try:
mF(func=list1[0], a=list1[1], b=list1[2], additional_str=list1[3])
return True
except Exception as e:
print(e)
traceback.print_exc()
print("An Exception occured - ignored it")
return False
arg_list = []
##for a in range(250000, 1500000, 25000):
## for b in range(12, 60, 3):
for a in range(1500000, 1550000, 25000):
for b in range(12, 18, 3):
arg_list.append([C1, a, b, 'Func3'])
# Make the Pool of workers
pool = ThreadPool(4)
# Open the Functions in their own threads
# and return the results
results = pool.map(mainFunc1, arg_list)
#close the pool and wait for the work to finish
pool.close()
pool.join() [/src]
EDIT:
Mod, kannst du den Thread bitte sinngemäß in Multithreading / Multiprozessing umbenennen?
für meine Bachelorarbeit habe ich ein Programm geschrieben, welches einige Emails einliest, Zeilen daraus extrahiert und dann mit diesen diverse Berechnungen anstellt:
- Koordinatensystem erstellen (einfach eine sehr große Liste und diese anschließend in ein ndarray (numpy) umwandelt)
- Entfernungen (haversine-Funktion) zwischen allen Matrix-Elementen bestimmt (ca. 20.000 Elemente)
- Diese Entfernungen in eine von mir übergebene Funktion einsetzt (Entfernung ist im Exponenten einer e-Funktion (wieder Numpy))
- Eine Matrix invertiert und 3 Matrizen miteinander multipliziert (Numpy)
- Aus einer Datei vorgegebene Werte ausließt und die dazugehörigen Werte in der Matrix suchst (GPS-Koordinaten werden verglichen)
- Differenzen zwischen Vorgabewert und errechnetem Wert bestimmt
- Und dann mit der nächsten Email beginnt
Die Funktion, die ich übergebe habe ich allerdings noch nicht optimiert (ich kenne die perfekten Parameter noch nicht) - Daher möchte ich den ganzen Vorgang mit verschiedenen Parametern durchführen lassen und ein Ergebnis zwischenspeichern, welches mir angibt, welche Parameter zu welcher Abweichung geführt haben. Diese Abweichung bestimmt sich aus der oben bestimmten Differenz zum Quadrat.
Da Python bei mir lediglich einen Kern nutzt und maximal 18% CPU-Last erreicht, habe ich nun an Multi-Threading gedacht.
Mit meinem Code werden allerdings lediglich mehrere Threads ausgeführt, nutzen aber weiterhin max. 18% CPU.
Vielleicht kann mir jemand einen offensichtlichen Fehler aufzeigen?
[src=python]import numpy as np
from main3 import mainFunc as mF
#import thread
from multiprocessing.dummy import Pool as ThreadPool
import traceback
def C1(distance, a = 1000000, b = 20):
if distance <= a:
#return b*(1.5*(distance/a - 0.5*(distance/a)**3))
#return b*(np.exp((-3*(distance/a)/10)))
return b*(np.exp((-0.1*(distance/a))))
#return b*np.exp((-3*(distance/a)/11))
#return b*np.exp(-0.05*(distance/a))
#return b*np.exp(-0.01*(distance/a))
#return b*(pow(1.1, -5*(distance/a)))
#return b*np.exp(-0.005*(distance/a))
#return b*np.exp(-0.05*np.sqrt((distance/a)))
else:
return b
def mainFunc1(list1):
try:
mF(func=list1[0], a=list1[1], b=list1[2], additional_str=list1[3])
return True
except Exception as e:
print(e)
traceback.print_exc()
print("An Exception occured - ignored it")
return False
arg_list = []
##for a in range(250000, 1500000, 25000):
## for b in range(12, 60, 3):
for a in range(1500000, 1550000, 25000):
for b in range(12, 18, 3):
arg_list.append([C1, a, b, 'Func3'])
# Make the Pool of workers
pool = ThreadPool(4)
# Open the Functions in their own threads
# and return the results
results = pool.map(mainFunc1, arg_list)
#close the pool and wait for the work to finish
pool.close()
pool.join() [/src]
EDIT:
Mod, kannst du den Thread bitte sinngemäß in Multithreading / Multiprozessing umbenennen?
Zuletzt bearbeitet:
