Линейная обработка данных до одновременной обработки - PullRequest
2 голосов
/ 11 марта 2020

Я пытаюсь понять многопроцессорность. Допустим, в списке хранится довольно большое количество значений от 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

...