【问题标题】:Parallelizing function in a for loopfor循环中的并行化函数
【发布时间】:2019-02-14 21:14:30
【问题描述】:

我有一个想要并行化的函数。

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))

我一直在阅读有关多处理的文档,但对于如何适当地并行化我的函数仍然有些困惑。如果有人能指出我并行化像我这样的函数的正确方向,我将不胜感激。

【问题讨论】:

    标签: python for-loop parallel-processing multiprocessing


    【解决方案1】:

    在您的函数中,您可以决定通过将文本拆分为子部分来进行并行化,将标记化应用于子部分,然后加入结果。

    类似的东西:

    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 是我们现在在标准计算机上可以期望的最大值),例如参见How much does parallelization help the performance if the program is memory-bound?What do the terms "CPU bound" and "I/O bound" mean?

    因此,您可以尝试将文本分成 2 个以上的部分,但可能不会更快。您甚至可能会得到令人失望的性能,因为拆分文本可能比处理它更昂贵。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-18
      • 2017-07-01
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      相关资源
      最近更新 更多