比较字符串嵌套列表的快速方法

时间:2018-07-10 11:37:11

标签: python optimization comparison

我正在尝试将两个嵌套的字符串列表相互比较,并搜索最快的方法。为此,我目前正在计算嵌套列表的每个元素之间的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....

1 个答案:

答案 0 :(得分:0)

这不会为您带来巨大的性能提升,但 如果您的内部列表很短(例如您的示例中的2或3个元素),您可以做的一件事就是自己将列表相交\合并,通常这样做会更快:[val for val in i1 if val in i2]而不是这样的{{1 }} 对于交叉路口和联合路口,请使用:set(i1) & set(i2)

我尝试比较两个列表都包含约500k子列表且每个子列表包含3个随机字符串的两种方法,并将(外部循环)单次迭代所花费的时间从平均约0.6秒减少到了约0.45秒。至少在我的机器上平均(平均前100个周期)。

之类的东西会影响性能25%的原因是因为python在数据操作方面有很多开销,幸运的是有时可以将其最小化,但是我认为(不幸的)教训是不对大型数据集使用python因为这样的事情效率很低