具有两个句子列表的Python for Loop优化比较

时间:2017-12-19 07:36:52

标签: python python-2.7 performance for-loop revit

我有一些正在运行的python代码,但需要一段时间才能运行。我很确定它可以通过重新安排for循环或使用函数来优化,但我的尝试产生了不可思议的结果。

项目信息:

python version = Iron Python 2.7(Revit Dynamo)

listMaster =所有可用句子的主列表

List1 =要与listMaster进行比较的第二个句子列表

List2 =要与listMaster进行比较的第三个句子列表

当前工作流程:

  1. 循环浏览List1
  2. 遍历listMaster中的每个项目
  3. 使用SequenceMatcher Ratio获得基于比率的匹配
  4. 对List2,List3等重复上面

    # Compare Excel Serious Warnings with All Revit Data
    for itemExcel in warnSeriousExcelData:
        for itemRvt in revitData:
            if SequenceMatcher(None, itemRvt, itemExcel).ratio() > 0.9:
                seriousLstCount = seriousLstCount + 1
                srsData.append(itemExcel)
    # Compare Excel Troublesome Warnings with All Revit Data
    for itemExcel in warnTroublesomeExcelData:
        for itemRvt in revitData:
            if SequenceMatcher(None, itemRvt, itemExcel).ratio() > 0.9:
                troubleLstCount = troubleLstCount + 1
                troubleData.append(itemExcel)
    # Compare Excel Bothersome Warnings with All Revit Data
    for itemExcel in warnBothersomeExcelData:
        for itemRvt in revitData:
            if SequenceMatcher(None, itemRvt, itemExcel).ratio() > 0.9:
                botherLstCount = botherLstCount + 1
                botherData.append(itemExcel)
    # Compare Excel Benign Warnings with All Revit Data
    for itemExcel in warnBenignExcelData:
        for itemRvt in revitData:
            if SequenceMatcher(None, itemRvt, itemExcel).ratio() > 0.89:
                benignLstCount = benignLstCount + 1
                benignData.append(itemExcel)
    # Compare Excel Unrecoverable Warnings with All Revit Data
    for itemExcel in warnUnrecoverExcelData:
        for itemRvt in revitData:
            if SequenceMatcher(None, itemRvt, itemExcel).ratio() > 0.8:
                unrecoverLstCount = unrecoverLstCount + 1
                unrecoverData.append(itemExcel)
    
  5. 如果有帮助,请参阅数据图像。 Data Image Example

    我正在考虑加快迭代过程,可能会翻转for循环。那么顶部循环将是整个listMaster,然后我会检查那个for循环中的每个List1,List2?但我不知道这是否是最快的方法呢?

    对此的任何帮助都会很棒。我再次使用Python 2.7,所以我不能使用3.5等中的一些新功能。

    更新以运行减少循环长度但仍然运行缓慢。

    for itemRvt in revitData:
        for itemExcel in warnSeriousExcelData:
            if SequenceMatcher(None, itemRvt, itemExcel).ratio() > 0.9:
                    seriousLstCount = seriousLstCount + 1
                    srsData.append(itemExcel)
        for itemExcel in warnTroublesomeExcelData:
            if SequenceMatcher(None, itemRvt, itemExcel).ratio() > 0.9:
                    troubleLstCount = troubleLstCount + 1
                    troubleData.append(itemExcel)
        for itemExcel in warnBothersomeExcelData:
            if SequenceMatcher(None, itemRvt, itemExcel).ratio() > 0.9:
                    botherLstCount = botherLstCount + 1
                    botherData.append(itemExcel)
        for itemExcel in warnBenignExcelData:
            if SequenceMatcher(None, itemRvt, itemExcel).ratio() > 0.89:
                benignLstCount = benignLstCount + 1
                benignData.append(itemExcel)
        for itemExcel in warnUnrecoverExcelData:
            if SequenceMatcher(None, itemRvt, itemExcel).ratio() > 0.8:
                unrecoverLstCount = unrecoverLstCount + 1
                unrecoverData.append(itemExcel)
    

    马特

1 个答案:

答案 0 :(得分:0)

要多次有效地查找数据条目,不应使用列表来存储它们,而应使用字典或散列表。未排序的列表会强制您为每个查找迭代整个事物。字典或哈希表要快得多。数千倍的速度,有很多条目。将您的warnXyzExcelData集合转换为字典,一切都会好的。修复非常简单。祝你好运,玩得开心!