Я пытаюсь понять многопроцессорность. Допустим, в списке хранится довольно большое количество значений от 0 до 1.
a = [rand() for _ in range(1e9)]
И я хочу что-то сделать, если значение больше 0,5.
for i in a:
if i > 0.5:
do_something()
Таким образом, каждое значение будет оцениваться линейно. Но могу ли я вычислить несколько значений одновременно?
is_above = (i for i in a if i > 0.5)
import multiprocessing as mp
pool = mp.Pool()
task = pool.imap(do_something, is_above, chunksize=1e9/4) # 1e9 elements divided by 4 cores?
pool.close()
pool.join()
Будет ли этот фрагмент кода работать должным образом?
Редактировать: Вот конкретный пример с простыми числами:
import multiprocessing as mp
def is_prime(num):
if num > 2:
for i in range(2, num // 2):
if (num % i) == 0:
break
else:
print(num)
start = 1_000_000_000
stop = 1_000_000_500
a = (i for i in range(start, stop))
if __name__ == '__main__':
p = mp.Pool()
t = p.imap(is_prime, a, chunksize=int((stop - start) / 6)) #6 cores
p.close()
p.join()
Я думаю, что всем, кто интересуется этим, следует прочитать это раньше: https://medium.com/contentsquare-engineering-blog/multithreading-vs-multiprocessing-in-python-ece023ad55a