Функция распараллеливания в цикле for - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть функция, которую я хотел бы распараллелить.

import multiprocessing as mp
from pathos.multiprocessing import ProcessingPool as Pool

cores=mp.cpu_count()

# create the multiprocessing pool
pool = Pool(cores)

def clean_preprocess(text):
    """
    Given a string of text, the function:
    1. Remove all punctuations and numbers and converts texts to lower case
    2. Handles negation words defined above.
    3. Tokenies words that are of more than length 1
    """
    cores=mp.cpu_count()
    pool = Pool(cores)
    lower = re.sub(r'[^a-zA-Z\s\']', "", text).lower()
    lower_neg_handled = n_pattern.sub(lambda x: n_dict[x.group()], lower)
    letters_only = re.sub(r'[^a-zA-Z\s]', "", lower_neg_handled)
    words = [i for i  in tok.tokenize(letters_only) if len(i) > 1] ##parallelize this? 
return (' '.join(words))

Я читал документацию по многопроцессорности, но все еще немного не уверен, как правильно распараллелить мою функцию.Я буду благодарен, если кто-нибудь может указать мне правильное направление при распараллеливании функции, подобной моей.

1 Ответ

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

В вашей функции вы можете решить распараллелить, разделив текст на части, применив токенизацию к частям, а затем объедините результаты.

Что-то в этом роде:

text0 = text[:len(text)/2]
text1 = text[len(text)/2:]

Затем примените свою обработку к этим двум частям, используя:

# here, I suppose that clean_preprocess is the sequential version, 
# and we manage the pool outside of it
with Pool(2) as p:
  words0, words1 = pool.map(clean_preprocess, [text0, text1])
words = words1 + words2
# or continue with words0 words1 to save the cost of joining the lists

Однако ваша функция кажется связанной с памятью, поэтомуон не будет иметь ужасного ускорения (обычно фактор 2 - это максимум, на который мы можем надеяться в наши дни на стандартных компьютерах), см., например, Насколько распараллеливание помогает производительности, если программа ограничена памятью? или Что означают термины «привязка к процессору» и «привязка к вводу / выводу»?

Таким образом, вы можете попытаться разбить текст более чем на 2 части, но, возможно, не получится быстрее,Вы можете даже получить разочаровывающую производительность, потому что разделение текста может быть более дорогим, чем его обработка.

...