我有两个用于计算Damerau–Levenshtein距离的字符串列表 检查哪些相似。我拥有的那些列表的问题超过200k +,并且具有理解力,这需要花费大量时间。对于距离计算,我使用的是用Cython编写的pyxDamerauLevenshtein软件包,因此应该没有瓶颈
series = ([damerau_levenshtein_distance(i, j) for i in original_string for j in compare_string])
这就是我的代码的样子,我想知道是否可以对其进行矢量化以提高性能,或者通过其他方式来加快计算速度?
我的数据集是什么
原始字符串-它是pd。一系列唯一的街道名称
比较字符串-这是pd。我想比较以查找相似性的一系列手动输入的街道名称
输出应如下所示:
Original Compare Distance
0 Street1 Street1 1
1 Street2 Street1 2
2 Street3 Street1 3
3 Street4 Street3 5
4 Street5 Street3 5
5 Street6 Street6 1
答案 0 :(得分:2)
如果您可以想到一种使用地图(或imap)函数而不是嵌套循环的方法,则可以尝试使用multiprocessing来充分利用您的CPU。例如,在这种情况下:
pool.map(lambda j: map(lambda i: damerau_levenshtein_distance(i, j),original_string),compare_string)
其中“ pool.map”是多处理地图,第二个“ map”是常规地图。
下面是一个快速但实用的多处理示例,可以涵盖您要查找的内容。由于您的列表很长,我对它的结构进行了一些不同的选择,以避免出现某些酸洗问题并使其在后台进行异步计算。
(这绝对可以改进,但是希望可以作为示例的概念证明)
import multiprocessing as mp
import itertools
list1 = range(5)
list2 = range(5)
def doSomething(a,b):
return a+b #Your damerau_levenshtein_distance function goes here
def mapDoSomething(args):
i = args[0] #An element of list2
otherlist = args[1] #A copy of list1
return [doSomething(i,j) for j in otherlist]
if __name__ == '__main__':
pool = mp.Pool()
answer = pool.imap(mapDoSomething,zip(list2,itertools.repeat(list1)))
print(list(answer)) #imap will compute the results in the background whilst the rest of the code runs. You can therefore ask for individual lists of results, and it won't block unless the result hasn't been computed yet. To do this, you would use answer.next() or iterate over the results somewhere else. However, by converting to a list here, I'm forcing all results to finish before printing. This is only to show you it worked. For larger lists, don't do this.
pool.close()
pool.join()
此代码产生:
[[0,1,2,3,4],[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7 ], [4、5、6、7、8]]
这是list1的每个元素(我添加了它们)list2的每个元素,我认为这是您试图在代码中使用字符串列表执行的操作。
代码设置了进程池,然后使用imap将对list2的操作的处理划分为多个进程。 zip函数将list2的元素与list1的完整副本懒散地分组,因为imap仅支持带有单个参数的函数。然后将这个组分解并用在mapDoSomething中,后者在list1的每个元素和list2的每个元素上运行doSomething函数。
自从我使用imap以来,列表一经计算就立即打印出来,而不是等待整个结果完成。