Code: Alles auswählen
import time
import multiprocessing as mp
import sys
def split(data, n):
k, m = divmod(len(data), n)
return list(data[i*k+min(i, m):(i+1)*k+min(i+1, m)] for i in range(n))
def my_func(x):
print(len(x))
for i in range(len(x)): # nur da, damit die Funktion auch Zeit verbraucht
a = i * i
return sum(x)
def main(num_procs):
pool = mp.Pool(num_procs)
result = pool.map(my_func, split(list(range(10**8)), num_procs))
print("num_procs:", num_procs, "result:", sum(result))
if __name__ == "__main__":
start_time = time.process_time()
main(int(sys.argv[1]))
print(f'time needed: {(time.process_time() - start_time)} s')
Code: Alles auswählen
num_procs: 1 result: 4999999950000000
time needed: 6.375935067 s
num_procs: 2 result: 4999999950000000
time needed: 6.353192033 s
50000000
50000000
num_procs: 4 result: 4999999950000000
time needed: 6.453357544999999 s
25000000
25000000
25000000
25000000
num_procs: 8 result: 4999999950000000
time needed: 6.496723103 s
12500000
12500000
12500000
12500000
12500000
12500000
12500000
12500000
1. Für num_procs = 1 fehlt die Ausgabe von print(len(x)) (erste Aktion in my_func), wieso?
2. Wie kann es sein, dass die Ausgaben von print(len(x)) erst kommen, nachdem das Ergebnis und die Zeit geprintet werden?
3. Was mache ich falsch, dass mehr Prozesse länger brauchen?