【发布时间】:2021-12-23 22:03:29
【问题描述】:
我使用 this 和 this 并行运行 2 个函数调用,但时间几乎没有改善。这是我的代码:
顺序:
from nltk import pos_tag
def posify(txt):
return ' '.join([pair[1] for pair in pos_tag(txt.split())])
df1['pos'] = df1['txt'].apply(posify) # ~15 seconds
df2['pos'] = df2['txt'].apply(posify) # ~15 seconds
# Total Time: 30 seconds
平行:
from nltk import pos_tag
import multiprocessing
def posify(txt):
return ' '.join([pair[1] for pair in pos_tag(txt.split())])
def posify_parallel(ser, key_name, shared_dict):
shared_dict[key_name] = ser.apply(posify)
manager = multiprocessing.Manager()
return_dict = manager.dict()
p1 = multiprocessing.Process(target=posify_parallel, args=(df1['txt'], 'df1', return_dict))
p1.start()
p2 = multiprocessing.Process(target=posify_parallel, args=(df2['txt'], 'df2', return_dict))
p2.start()
p1.join(), p2.join()
df1['pos'] = return_dict['df1']
df2['pos'] = return_dict['df2']
# Total Time: 27 seconds
我预计总时间约为 15 秒,但我得到了 27 秒。
如果有什么不同的话,我有一个 6 核(12 个逻辑)的 i7 2.6GHz CPU。
是否有可能在 15 秒左右达到目标?这是否与pos_tag 函数本身有关?
编辑:
我最终只是做了以下事情,现在是 15 秒:
with Pool(cpu_count()) as pool:
df1['pos'] = pool.map(posify, df1['txt'])
df2['pos'] = pool.map(posify, df2['txt'])
我认为这样行运行顺序,但它们中的每一个在内部并行运行。只要是 15 秒,我就可以。
【问题讨论】:
-
你有一个非常大的数据框吗?
-
@BrutusForcus - 每行 9K 行。