Как распараллелить сложное для циклов - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть сложный цикл for, который содержит несколько операций для нескольких записей в цикле.Цикл выглядит следующим образом:

for i,j,k in zip(is,js,ks):
    #declare multiple lists.. like
    a = []
    b = []
    #...
    if i:
        for items in i:
            values = items['key'].split("--")
            #append the values to the declared lists
            a.append(values[0])
            b.append(values[1])
    # also other operations with j and k where are is a list of dicts. 
    if "substring" in k:
        for k, v in j["key"].items():
            l = "string"
            t = v
    else:
        for k, v in j["key2"].items():
            l = k
            t = v

            # construct an object with all the lists/params
            content = {
                'sub_content': {
                    "a":a,
                    "b":b,
                    .
                    .
                }
            }

            #form a tuple. We are interested in this tuple.
            data_tuple = (content,t,l)

Учитывая приведенный выше цикл for, как его распараллелить?Я изучил многопроцессорность, но не смог распараллелить такой сложный цикл.Я также открыт для предложений, которые могли бы работать лучше, включая парадигмы параллельных языков, такие как OpenMP / MPI / OpenACC.

1 Ответ

0 голосов
/ 28 февраля 2019

Вы можете использовать многопроцессорную библиотеку Python .Как отмечалось в этом превосходном ответе , вам следует выяснить, нужна ли вам многопоточность или многопоточность.

Итог : если вам нужна многопоточность, вы должны использовать multiprocessing.dummy.Если вы выполняете только задачи с интенсивным использованием процессора без ввода-вывода / зависимостей, вы можете использовать многопроцессорность.

multiprocessing.dummy - это то же самое, что и многопроцессорный модуль, но вместо него используются потоки (важное различие - использование нескольких процессов для задач с интенсивным использованием процессора; потоки для (и во время) ввода-вывода):

Настройка zip-объекта

#!/usr/bin/env python3

import numpy as np

n = 2000
xs = np.arange(n)
ys = np.arange(n) * 2
zs = np.arange(n) * 3

zip_obj = zip(xs, ys, zs)

Простой пример функции

def my_function(my_tuple):
    iv, jv, kv = my_tuple
    return f"{str(iv)}-{str(jv)}-{str(kv)}"   

Настройка многопоточности.

from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool(4)
data_tuple = pool.map(my_function, zip_obj)

Ваше полноепример

def my_function(my_tuple):
    i, j, k = my_tuple
    #declare multiple lists.. like
    a = []
    b = []
    #...
    if (i):
        for items in i:
            values = items['key'].split("--")
            #append the values to the declared lists
            a.append(values[0])
            b.append(values[1])
     #also other ooperations with j and k where are is a list of dicts. 
     if ("substring" in k):
           for k, v in j["key"].items():
               l = "string"
               t = v
      else:
           for k, v in j["key2"].items():
               l = k
               t = v
    #construct an object called content with all the lists/params like
           content = {
                'sub_content': {
                  "a":a,
                  "b":b,
                  .
                  .
                }
            }
    #form a tuple. We are interested in this tuple.
    return (content,t,l)


from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool(4)
zip_obj = zip(is,js,ks)
data_tuple = pool.map(my_function, zip_obj)
# Do whatever you need to do w/ data_tuple here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...