Ich habe einen einfachen Code zu gruppieren und Inhalt der Liste zu berechnen. Ich bin besorgt über die Zeit, die es braucht, um den Job zu erledigen. Mit weniger als 100 Gegenständen ist es schnell genug, aber mehrere hundert Gegenstände lassen meinen Mac zum Schreien kommen. Und ich habe bis zu 10000 Punkte auf einer Liste von realen Daten. Also muss ich wissen, wie es möglich ist, diesen Code zu optimieren:Listen Manipulation Code-Optimierung mit Python
v = [1,2,3,4,5,6,7,8,9,10]
v1 = v[:5]
l = len(v1)
a = [sum(v1[x:y]) for y in range(l+1) for x in range(y)]
d = {x:a.count(x) for x in a}
so auf v gibt es eine Liste von ganzen Zahlen. Ziffer kann von 1 bis 4000 sein. Die Listenlänge bei Beispiel ist 10, aber wie oben erwähnt, wird es gehen zu 10000 gehen. v1 ist nur eine Split-Liste mit kleineren Testdaten arbeiten.
ein bekommt jedes Element als eine einzelne Instanz und alle vorhergehenden Artikel als Beispiele:
[1, 3, 2, 6, 5, 3, 10, 9, 7, 4, 15, 14, 12, 9, 5]
d alle Elemente Gruppen und zählt sie als Schlüsselwertpaar Wörterbuch:
{1: 1, 2: 1, 3: 2, 4: 1, 5: 2, 6: 1, 7: 1, 9: 2, 10: 1, 12: 1, 14: 1, 15: 1}
Es scheint, dass die Berechnung ein bereits nach 100 + Elemente sehr schwer wird. Mit 500 Artikeln auf ein bekomme ich 276813 Instanzen für d. Also, wenn es 10000 Artikel auf einer Liste gibt, erwarte ich bis zu 5559333 Artikel auf d und vielleicht 100-mal mehr auf ein.
UPDATE
Basierend auf Kommentare und Antworten unten eine gewisse Verbesserung ist unten über die Umsetzung getan:
def t5(v1):
l = len(v1)
d = {}
for x in range(0, l):
s = sum(v1[x:])
if s in d:
d[s] += 1
else:
d[s] = 1
for y in range(1, l-x):
s -= v1[-y]
if s in d:
d[s] += 1
else:
d[s] = 1
return d
Ich habe keine Ahnung, wie numpy zu verwenden und/oder numba für weitere Optimierung. Vielleicht gut für verschiedene separate Frage ...
Scheint, als ob Sie einen dynamischen Programmieransatz benötigen. Für jede der Summen in "a" können Sie zwei der kürzeren Beträge wiederverwenden. Dann ist Ihre Summierung nicht mehr O (n ** 3). – schwobaseggl
Sie könnten [numba] (http://numba.pydata.org/) darauf werfen und schauen, ob es reicht. Aber das Umschreiben, so dass es einen besseren Algorithmus verwendet (wie schwobaseggl es vorschlägt), ist der "richtige" Ansatz. – syntonym
@schwobaseggl Würden Sie gerne ein Beispiel dafür geben, wie Sie "Wiederverwendung von Summen" für den gegebenen Code implementieren? – MarkokraM