【发布时间】:2017-12-19 07:36:52
【问题描述】:
我有一些 Python 代码正在运行,但需要一段时间才能运行。我很确定可以通过重新安排 for 循环或使用函数来优化它,但我的尝试产生了不正确的结果。
项目信息:
python 版本 = Iron Python 2.7 (Revit Dynamo)
listMaster = 所有可用句子的主列表
List1 = 与 listMaster 比较的第二个句子列表
List2 = 与 listMaster 比较的第三个句子列表
当前工作流程:
- 循环遍历 List1
- 遍历 listMaster 中的每个项目
- 使用 SequenceMatcher Ratio 根据比率获取匹配项
-
对 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