【问题标题】:Python For Loop Optimisation with Two Lists of Sentence Compares具有两个句子比较列表的 Python For 循环优化
【发布时间】:2017-12-19 07:36:52
【问题描述】:

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

项目信息:

python 版本 = 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)
    

如果有帮助,请参阅数据图像。 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)

马特

【问题讨论】:

  • 我能想到的改进之一是只循环一次listMaster,并在每个列表的单独循环内。这样可以显着减少所花费的时间。
  • 已更新,但运行速度仍然很慢。还有其他想法或建议吗?
  • 看起来您的代码按预期工作,但有点慢。如果该观察是正确的 - 您可能会在 codereview.stackexchange.com 上获得更多运气。无论哪种方式,您都应该查看 cProfile 或任何其他 python 分析器。它将帮助您对正在发生的事情做出明智的决定。
  • 非常感谢。我还希望将代码翻译成 C#,看看它在这种环境下是否运行得更快。
  • 我不相信移植到 C# 会有帮助。 Python 很快。如果您用简短而简单的英语单词更好地解释您要达到的目标,那将更有帮助。这不仅仅是代码。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-05-02
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多