2017-11-29 3 views
0

Ich habe eine Excel-Datei, die zwei Spalten und 743914 Zeilen enthält. Was ich tun möchte, ist, Zeile für Zeile zu iterieren, und wenn die Kombination der beiden Zeilen zum ersten Mal gefunden wird, dann weisen Sie ihr in einer dritten Spalte einen Wert zu. Ansonsten ist der Wert der Wert, den ich beim ersten Mal neben dieser Kombination zugewiesen habe. Das Problem ist analog zu dem Versuch, ein Wörterbuch zu erstellen, bei dem der Schlüssel die Kombination der zwei vorhandenen Zeilen und der Wert die dritte Zeile ist. Ich habe den obigen Code geschrieben, den ich für 20 Zeilen getestet habe und funktioniert gut.Schlechte Leistung mit großem Dataset

from openpyxl import load_workbook 
wb = load_workbook('test.xlsx') 
dicta = {} 
i = 0 
lista = [] 
listb = [] 
ws = wb.active 
for row in ws.iter_rows(min_row=1, max_col=3, max_row=743914): 
    for cell in row: 
     i += 1 
     if i%3 != 0: 
      lista.append(cell.value) 
     if i%3 == 0: 
      if lista in listb: 
       cell.value = dicta[tuple(lista)] 
      else: 
       cell.value = i 
       dicta[tuple(lista)] = i 
       listb.append(lista) 
      lista = [] 

Mein Problem ist, wenn ich die Zeilen zu 743.914 vergrößere es unefficiently unendlich und völlig zu laufen scheint, wie es bereits für 15 Stunden ausgeführt wird, und ist noch nicht beendet.

Antwort

0

Ich glaube nicht, dass Ihr Problem mit openpyxl, sondern exponentiellen Wachstum Ihrer Listen und verschachtelten Schecks verbunden ist: if lista in listb sieht verdächtig aus. Ihr Schalter ist auch mehr oder weniger unkontrolliert.

+0

Es gibt nur 300 verschiedene Kombinationen im Datensatz, daher sollte die maximale Länge von listb 300 sein, was nicht so groß ist ... –

+0

Wenn es um Leistung geht, sollten Sie ** nie ** raten, was das Problem ist. Python hat gute Werkzeuge, um das herauszufinden. Sie haben rekursive Aufrufe an die Listen in Ihrem Code. Kommentieren Sie die Prüfungen und der Code sollte mit konstanter Geschwindigkeit laufen. –

+0

Ok danke, ich werde es tun –