Python 3.8 Listenvergleich beschleunigen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
notapro
User
Beiträge: 1
Registriert: Donnerstag 27. Januar 2022, 13:32

Hallo zusammen,
zuallererst sei erwähnt, ich bin kein Python-Profi. :D
Daher bräuchte ich eure Hilfe.

Ich habe zwei Listen von anderen Abfragen/Erzeugung.
Jetzt möchte ich nur die kompletten Strings aus "str_sql_tmp" rausfiltern, welche in teilen mit "fk_exists" übereinstimmen.
Ich habe folgendes gemacht:

Code: Alles auswählen

str_sql_tmp = [ "('R0001e5e7','C000219c0',st_geometryfromtext('POLYGON((1.0 2.0,2.0 2.0,2.0 1.0,1.0 1.0,1.0 2.0))'))",
		"('R0001e5e8','C000219c6',st_geometryfromtext('POLYGON((2.0 3.0,3.0 3.0,3.0 2.0,2.0 2.0,2.0 3.0))'))",
		"('R0001e5e9','C000219c2',st_geometryfromtext('POLYGON((3.0 4.0,4.0 4.0,4.0 3.0,3.0 3.0,3.0 4.0))'))"]
### normaly over 600.000 entries

fk_exists = ['R0001e5e7/C000219c0', 'R0001e5e9/C000219c2']
### normaly over 250.000 entries

str_sql = []
for x in str_sql_tmp:
    if x[2:23].replace("','", "/") in fk_exists:
        str_sql.append(x)
        
Das funktioniert so wie ich es möchte.
Allerdings enthalten die Listen rund 250.000 und rund 600.000 Einträge, wodurch der Vergleich sehr lange läuft.
Gibt es eine Möglichkeit, dies zu beschleunigen?
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Wer erzeugt denn die Daten auf diese Weise? Gibt es da keine Möglichkeit, die sinnvoller zu speichern?
Das benutzen von fixen Indizes ist nicht sehr robust. Da würde man eigentlich einen Parser für das Format schreiben.

Die Variablennamen sind nicht sehr gut. str_sql_tmp wäre wohl input_sql_values und str_sql result_sql_values.
`x` für einen Satz an Werten ist erst schlecht.

Was bedeutet für dich "sehr lang"? Bei mir sind 600000 Einträge in 200ms durch.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

mach mal aus der fk_exists ein Set

Code: Alles auswählen

fk_exists = set(fk_exists)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Sirius3 hat geschrieben: Donnerstag 27. Januar 2022, 14:59 Wer erzeugt denn die Daten auf diese Weise? Gibt es da keine Möglichkeit, die sinnvoller zu speichern?
Meine Vermutung ist ja, dass da für eine GIS-Datenbank INSERT-Statements mit Strings zusammengebastelt und in einem Zwischenschritt gefiltert werden sollen. So würde man das natürlich nicht machen, aber um einen besseren Vorschlag machen zu können, bräuchte man etwas mehr Code/Hintergrunduinformationen.
In specifications, Murphy's Law supersedes Ohm's.
Antworten