Python 编程:多处理
Python programming: multiprocessing
我有一个脚本。它是 CPU 密集型的,我可以使用多核机器,但它没有显示它的利用率。 Python3中的多处理库如何使用?还是别的什么?欢迎任何有关如何修改脚本的建议。谢谢!
from nltk.corpus import wordnet as wn
from itertools import chain
for line in infile:
word = line.strip()
if (word not in Dict):
Dict[word]=(set(["-","-","-"]),0)
lemma = lmtzr.lemmatize(word)
for w, net1, net2, lch in syn(lemma):
if (word not in Dict):
Dict[word]={}
for l in net2.lemmas():
synonyms.append(l.name())
Dict[word] = (set(synonyms),round(lch,2))
synonyms =[]
infile.close()
csv_writer(Dict, "Text8_types_similar_lch.csv")
你可以使用joblib。首先,将您的代码放在一个可以处理任意行数的函数中。您可以将函数的结果写入 csv 文件,从而为每个进程生成一个不同的文件,您必须合并该文件,或者只是 return something:
def my_func(lines):
return_dict = {}
for line in lines:
# put your code here
return return_dict
然后,编写一个函数将 lines
分成更小的块:
from itertools import islice
def grouper(n, iterable):
it = iter(iterable)
while True:
chunk = tuple(islice(it, n))
if not chunk:
return
yield chunk
最后,调用 joblib 的 Parallel
将每个数据块传递给您的函数:
from joblib import Parallel, delayed
results = Parallel(n_jobs=num_cores)(
delayed(my_func)(line_chunk) for line_chunk in grouper(lines, 500))
results
将是来自 my_func
的 returned 项的列表,您可以按照自己的喜好合并它们。
我有一个脚本。它是 CPU 密集型的,我可以使用多核机器,但它没有显示它的利用率。 Python3中的多处理库如何使用?还是别的什么?欢迎任何有关如何修改脚本的建议。谢谢!
from nltk.corpus import wordnet as wn
from itertools import chain
for line in infile:
word = line.strip()
if (word not in Dict):
Dict[word]=(set(["-","-","-"]),0)
lemma = lmtzr.lemmatize(word)
for w, net1, net2, lch in syn(lemma):
if (word not in Dict):
Dict[word]={}
for l in net2.lemmas():
synonyms.append(l.name())
Dict[word] = (set(synonyms),round(lch,2))
synonyms =[]
infile.close()
csv_writer(Dict, "Text8_types_similar_lch.csv")
你可以使用joblib。首先,将您的代码放在一个可以处理任意行数的函数中。您可以将函数的结果写入 csv 文件,从而为每个进程生成一个不同的文件,您必须合并该文件,或者只是 return something:
def my_func(lines):
return_dict = {}
for line in lines:
# put your code here
return return_dict
然后,编写一个函数将 lines
分成更小的块:
from itertools import islice
def grouper(n, iterable):
it = iter(iterable)
while True:
chunk = tuple(islice(it, n))
if not chunk:
return
yield chunk
最后,调用 joblib 的 Parallel
将每个数据块传递给您的函数:
from joblib import Parallel, delayed
results = Parallel(n_jobs=num_cores)(
delayed(my_func)(line_chunk) for line_chunk in grouper(lines, 500))
results
将是来自 my_func
的 returned 项的列表,您可以按照自己的喜好合并它们。