使用地图进行多处理
Multiprocessing using map
我有一个字符串列表,我正在对每个字符串进行一些更改,您可以在 wordify()
中看到这些更改。现在,为了加快速度,我使用 chunked()
将列表拆分为子列表(子列表的数量是 CPU 核心的数量 - 1)。这样我得到的列表看起来像 [[,,],[,,],[,,],[,,]]
。
我努力实现的目标:
我想同时对每个子列表执行 wordify()
,将子列表作为单独的列表返回。我想等到所有进程完成,然后将这些子列表加入一个列表。以下方法无效。
import multiprocessing
from multiprocessing import Pool
from contextlib import closing
def readFiles():
words = []
with open("somefile.txt") as f:
w = f.readlines()
words = words + w
return words
def chunked(words, num_cpu):
avg = len(words) / float(num_cpu)
out = []
last = 0.0
while last < len(words):
out.append(words[int(last):int(last + avg)])
last += avg
return out
def wordify(chunk,wl):
wl.append([chunk[word].split(",", 1)[0] for word in range(len(chunk))])
return wl
if __name__ == '__main__':
num_cpu = multiprocessing.cpu_count() - 1
words = readFiles()
chunked = chunked(words, num_cpu)
wordlist = []
wordify(words, wordlist) # works
with closing(Pool(processes = num_cpu)) as p:
p.map(wordify, chunked, wordlist) # fails
您编写的代码只是将一个函数传递给 map
;知道您希望它将 wordlist
传递给函数的第二个参数还不够聪明。
TBH 部分函数应用在 Python 中有点笨拙,但您可以使用 functools.partial
:
from functools import partial
p.map(partial(wordify, wordlist), chunked)
我有一个字符串列表,我正在对每个字符串进行一些更改,您可以在 wordify()
中看到这些更改。现在,为了加快速度,我使用 chunked()
将列表拆分为子列表(子列表的数量是 CPU 核心的数量 - 1)。这样我得到的列表看起来像 [[,,],[,,],[,,],[,,]]
。
我努力实现的目标:
我想同时对每个子列表执行 wordify()
,将子列表作为单独的列表返回。我想等到所有进程完成,然后将这些子列表加入一个列表。以下方法无效。
import multiprocessing
from multiprocessing import Pool
from contextlib import closing
def readFiles():
words = []
with open("somefile.txt") as f:
w = f.readlines()
words = words + w
return words
def chunked(words, num_cpu):
avg = len(words) / float(num_cpu)
out = []
last = 0.0
while last < len(words):
out.append(words[int(last):int(last + avg)])
last += avg
return out
def wordify(chunk,wl):
wl.append([chunk[word].split(",", 1)[0] for word in range(len(chunk))])
return wl
if __name__ == '__main__':
num_cpu = multiprocessing.cpu_count() - 1
words = readFiles()
chunked = chunked(words, num_cpu)
wordlist = []
wordify(words, wordlist) # works
with closing(Pool(processes = num_cpu)) as p:
p.map(wordify, chunked, wordlist) # fails
您编写的代码只是将一个函数传递给 map
;知道您希望它将 wordlist
传递给函数的第二个参数还不够聪明。
TBH 部分函数应用在 Python 中有点笨拙,但您可以使用 functools.partial
:
from functools import partial
p.map(partial(wordify, wordlist), chunked)