我正在尝试将两个嵌套的字符串列表相互比较,并搜索最快的方法。为此,我目前正在计算嵌套列表的每个元素之间的Jaccard-index(交集/并集)。 示例:
list1=[["abc","def","ghi"],["jkl","mno"]]
list2=[["pqr","def","stu"],["jkl","mno","vwx"]]
在此示例中,将第一个列表的第一个“集群”与第二个列表的每个集群进行比较,这将导致4(2 * 2)个不同的jaccard索引。
但是,我的问题是,我的两个列表每个都包含大约500.000个簇/元素(子列表)。使用我当前的代码,大约需要2周的时间来计算。此时,我无法减少计算时间并寻求帮助。
当前代码:
for i1 in list1:
for i2 in list2:
intersection = set(i1) & set(i2)
union = set(i1) | set(i2)
jaccard = (len(intersection) / len(union)) * 100
if jaccard > 1:
#write to file....
答案 0 :(得分:0)
这不会为您带来巨大的性能提升,但
如果您的内部列表很短(例如您的示例中的2或3个元素),您可以做的一件事就是自己将列表相交\合并,通常这样做会更快:[val for val in i1 if val in i2]
而不是这样的{{1 }}
对于交叉路口和联合路口,请使用:set(i1) & set(i2)
。
之类的东西会影响性能25%的原因是因为python在数据操作方面有很多开销,幸运的是有时可以将其最小化,但是我认为(不幸的)教训是不对大型数据集使用python因为这样的事情效率很低