-1

我有问题。我有一个高度递归的函数,随着数据集变得越来越大,这将需要数年时间才能执行。你有一个想法,如何优化它,让它可以在几分钟内运行吗?

DatenListeE124_DurchschnittMandate = {}
        for Daten in DatenListeE124:
            if Daten[0] not in DatenListeE124_DurchschnittMandate.keys():
                DatenListeE124_DurchschnittMandate[Daten[0]] = []
            DatenListeE124_DurchschnittMandate[Daten[0]].append(Daten)    
DatenListeE124_DurchschnittMandateTabelle = []
        # Durschnitt bilden aus der neuen Tabelle
        Jahre = list(range(datetime.datetime.now().year-(FormularHochladen.Jahre.data-1), datetime.datetime.now().year+1))
        for Schluessel in DatenListeE124_DurchschnittMandate.keys():
            for Daten in DatenListeE124_DurchschnittMandate[Schluessel]:
                for Daten2 in DatenListeE124_DurchschnittMandate[Schluessel]:
                    for Daten3 in DatenListeE124_DurchschnittMandate[Schluessel]:
                        if Daten[3] == Daten2[3] == Daten3[3] and Daten[2] == Daten2[2] + 1 == Daten3[2] + 2 and Daten[2] in Jahre:
                            DatenListeE124_DurchschnittMandateTabelle.append([Daten[0], Daten[1], f"{Daten[2]}, {Daten2[2]}, {Daten3[2]}", Daten[3], round((Daten[4]+Daten2[4]+Daten3[4])/3, 2), round((Daten[5]+Daten2[5]+Daten3[5])/3, 2), round((Daten[6]+Daten2[6]+Daten3[6])/3, 2), round((Daten[7]+Daten2[7]+Daten3[7])/3, 2), round((Daten[8]+Daten2[8]+Daten3[8])/3, 2)])

列表的演示内容:

    Jahre = [2019, 2020, 2021]
    DatenListeE124_DurchschnittMandate = {10021: [[10021, 'Max, Mustermann', 2012, 35, 694.9, 523.9, 171.0, 3.0, 174.63], [10021, 'Max, Mustermann', 2013, 35, 794.1, 627.86, 166.24, 3.0, 209.29]], 10025: [[10025, 'Max Mustermann 2', 2013, 98, 5.8, 5.8, 0, 0, -1]], 10026: [[10026, 'Max Mustermann 3', 2012, 24, 300.9, 300.9, 0, 0, -1], [10026, 'Max Mustermann 3', 2012, 35, 999, 695, 304, 4, 173.75]], 10027: [[10027, 'Max Mustermann 4', 2014, 35, 574.95, 291.95, 283, 5.08, 57.43]]}
    DatenListeE124 = [[10021, 'Max, Mustermann 1', 2012, 35, 694.9, 523.9, 171.0, 3.0, 174.63], [10021, 'Max, Mustermann 1', 2013, 35, 794.1, 627.86, 166.24, 3.0, 209.29], [10025, 'Max, Mustermann 2', 2013, 98, 5.8, 5.8, 0, 0, -1], [10026, 'Max, Mustermann 3', 2012, 24, 300.9, 300.9, 0, 0, -1], [10026, 'Max, Mustermann 3', 2012, 35, 999, 695, 304, 4, 173.75], [10027, 'Max, Mustermann 4', 2014, 35, 574.95, 291.95, 283, 5.08, 57.43], [10030, 'Max, Mustermann 5', 2015, 33, 670, 98.6, 571.4, 12.02, 8.21], [10032, 'Max, Mustermann 6', 2018, 21, 180, 148.5, 31.5, 0.5, 297.0]]

也许更节省内存?

谢谢你的帮助!

4

2 回答 2

0

当然,你的问题是这里的牛肚循环......

for Daten in DatenListeE124_DurchschnittMandate[Schluessel]:
  for Daten2 in DatenListeE124_DurchschnittMandate[Schluessel]:
    for Daten3 in DatenListeE124_DurchschnittMandate[Schluessel]:
      if Daten[3] == Daten2[3] == Daten3[3] and Daten[2] == Daten2[2] + 1 == Daten3[2] + 2 and Daten[2] in Jahre:
         ...

您不应该DatenListeE124_DurchschnittMandate[Schluessel]在三重循环中进行迭代。所以想法是:

  • 您可以做的最好的事情是使用两个字典按元素的Daten[2]Daten[3]值来索引元素。然后只迭代符合最后一行条件的元素
  • 一个更简单的改进是尽快修剪搜索,例如:
for Daten in DatenListeE124_DurchschnittMandate[Schluessel]:
    if Daten[2] in Jahre:
      for Daten2 in DatenListeE124_DurchschnittMandate[Schluessel]:
        if Daten[3] == Daten2[3] and Daten[2] == Daten2[2] + 1:
          for Daten3 in DatenListeE124_DurchschnittMandate[Schluessel]:
            if Daten[3] == Daten3[3] and Daten[2] == Daten3[2] + 2 :
         ...
于 2021-02-04T08:35:15.807 回答
0

其他人指出的解决方案是使用:''' itertools.product(DatenListeE124_Durchschnitt[Schlüssel], repeat=3)''' 效果非常好,速度快!

于 2021-02-04T20:35:57.060 回答