2017-10-06 2 views
0

Ich habe 500 Datensätze in der Datenbank, und ich sie alle in eine Python-Liste von Wörterbuchelementen. (25 Schlüssel-Wert-Paare)Verfahrgeschwindigkeit Python Liste

Laden

ich eine Methode nenne, die in allen Wörterbuchelementen durchquert die Liste und führt eine Aktion für jeden Datensatz durch. Während des Traversierens habe ich festgestellt, dass die Logik nach der Hälfte der Elemente die Methode verlässt und für die nächste Hälfte erneut startet.

Ich habe versucht, es als ein Beispiel zu setzen. (Ich kann den genauen Code nicht kopiert werden, da es nicht möglich ist)

Ex:

def loadrec(): 
    reading from database and appending rows to a global list(mylist) 

def myrun(): 
    print "****** Execution Started **********" 
    for row in mylist: 
    doing some operations and printing a string 

if __name__=="__main__": 
i=0 
while (i>=0): #This never ends(to make the script run forever) 
    loadrec() 
    myrun() 
    print "****** Execution Ended ************" 



Result: 


****** Execution Started ********** 
printed 250 records 
****** Execution Ended ************ 


****** Execution Started ********** 
printed 125 records 
****** Execution Ended ************ 


****** Execution Started ********** 
printed 62 records 
****** Execution Ended ************ 

****** Execution Started ********** 
printed 31 records 
****** Execution Ended ************ 

****** Execution Started ********** 
printed 15 records 
****** Execution Ended ************ 

****** Execution Started ********** 
printed 7 records 
****** Execution Ended ************ 

****** Execution Started ********** 
printed 1 record 
****** Execution Ended ************ 

Ich bin nicht sicher, warum es jedes Mal nur die Hälfte des gesamten Datensätze verarbeitet. Aber am Ende verarbeitet es alle Datensätze.

Ich habe versucht zu überprüfen, ob es ein Problem mit Python-Liste maximale Größe oder Speicher gibt, aber keiner von ihnen scheint ein mögliches Szenario zu sein.

Wäre froh, einen Hinweis darauf zu haben, was der Grund gewesen sein könnte.

+2

Sie haben ein Problem mit Ihrem Code, aber Sie können uns den Code nicht zeigen, möchten aber trotzdem, dass jemand das Problem genau erkennt? Schwierig werden. Nach allem, was wir wissen, haben Sie explizit eine Unterbrechungsbedingung für die Hälfte der Liste codiert. Unwahrscheinlich, aber wie können wir das sagen? –

Antwort

1

Ich werde hier einen wilden Stich im Dunkeln machen.

Sie tun etwas wie folgt aus:

def myrun(): 
    print "****** Execution Started **********" 
    for row in mylist: 
     #Some processing here 
     myList.remove(row) 

Sie keine Liste mutieren können, die Sie iterieren. Dies würde dazu führen, dass nur die Hälfte der Liste jedes Mal bearbeitet wird. Sie müssen Ihren Code umgestalten. Ohne dass du uns deinen Code zeigst, werde ich nicht einmal versuchen, den Refactor zu machen.

+0

Dank Andrew für diesen wilden Stich. Das hat mich richtig getroffen. Ja du hast Recht. In einem meiner Methoden entferne ich den Gegenstand, den ich aus der Liste wiederhole. Wie Sie erwähnt haben, verarbeitet es nur die Hälfte davon. Jetzt habe ich meinen Code kommentiert, und es durchläuft jetzt ganze Elemente, ohne es zur Hälfte zu machen. –

+0

Wie bereits erwähnt, kann ich den Code aufgrund einiger Datenschutzeinschränkungen nicht teilen. Wie auch immer, Sie können das Problem genau lokalisieren. Dank dafür. Ich würde gerne wissen, warum Python jedes Mal nur die Hälfte der Elemente verarbeitet, wenn eine Logik zum Entfernen vorhanden ist. Da ich das Element aus der Liste entfernen muss (nach Logik), glauben Sie, dass das Beibehalten alten Codes Probleme verursachen wird. (Am Ende verarbeite ich noch alle Elemente, aber die Verarbeitung geschieht jedes Mal in zwei Hälften). –

+0

https://unspecified.wordpress.com/2009/02/12/thou-shalt-not-modify-a-list-during-iteration/ Dies wird es besser erklären, als ich hier im Raum kann. Wenn Sie nur jedes Element in der Liste bearbeiten möchten, gibt es keinen Grund, dass Sie die Schleife "while" beibehalten sollten. Sicher möchtest du, dass das Skript irgendwann endet? –

Verwandte Themen