gpt4 book ai didi

针对 fuzzywuzzy 的 Python 多处理列表

转载 作者:行者123 更新时间:2023-12-02 04:21:36 25 4
gpt4 key购买 nike

我有两个列表需要相互匹配。我需要将每个 str1 单词与每个 str2 单词列表进行匹配。我在 str2 中有一个 40k 单词的列表。我想尝试使用多处理来使其运行得更快。

例如:

str1 = ['how', 'are', 'you']
str2 = [['this', 'how', 'done'], ['they', 'were', 'here'], ['can', 'you', 'leave'], ['how', 'sad]]

我尝试过的代码:

from multiprocessing import Process, Pool
from fuzzywuzzy import process


def f(str2, str1):
for u in str1:
res = []
for i in str2:
Ratios = process.extract(u,i)
res.append(str(Ratios))
print(res)
return res

if __name__ == '__main__':
str1 = ['how', 'are', 'you']
str2 = [['this', 'how', 'done'], ['they', 'were', 'here'], ['can', 'you', 'leave'], ['how', 'sad]]
for i in str2:
p = Process(target=f, args=(i, str1))
p.start()
p.join()

这不会返回我期望的结果 - 我期望输出看起来像数据框:

words                   how are you
['this', 'how', 'done'] 100 0 0
['they', 'were', 'here'] 0 90 0
['can', 'you', 'leave'] 0 80 100
['how', 'sad'] 100 0 0

最佳答案

由于这个循环,您并没有真正使用并行多处理:

for i in str2:
p = Process(target=f, args=(i, str1))
p.start()
p.join()

p.join() 等待每个进程按顺序完成。因此,该构造并没有加速(请注意,仅为每种情况创建一个新的干净进程就很有用,例如在某些情况下,您在 DLL 中加载 native 代码)。

您必须存储流程对象并在单独的循环中等待它们。

# create & store process objects
processes = [Process(target=f, args=(i, str1)) for i in str2]
# start processes
for p in processes:
p.start()
# wait for processes to complete
for p in processes:
p.join()

请注意,该方法有几个主要问题:

  • 这可能会导致同时运行太多进程
  • 如何获取 f 的返回值简单吗?

使用当前方法,返回值将丢失,除非将其存储在 manager 中。目的。 map方法允许获取结果,如上面的示例所示。

这就是进程池等对象存在的原因。小使用示例:

from multiprocessing import Pool

def sq(x):
return x**2

if __name__=="__main__":
p = Pool(2)
n = p.map(sq, range(10))
print(n)

这里只有 2 个进程同时处于事件状态。

您的代码,适用于池(未经测试)

from multiprocessing import Pool
from fuzzywuzzy import process


def f(str2, str1):
for u in str1:
res = []
for i in str2:
Ratios = process.extract(u,i)
res.append(str(Ratios))
return res

if __name__ == '__main__':
str1 = ['how', 'are', 'you']
str2 = [['this', 'how', 'done'], ['they', 'were', 'here'], ['can', 'you', 'leave'], ['how', 'sad']]

nb_processes = 4
p = Pool(nb_processes)
results = p.map(f, [(i,str1) for i in str2])

results是每次调用 f 的返回值列表(列表) ,按照 str2 指定的顺序

关于针对 fuzzywuzzy 的 Python 多处理列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59741297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com