
MoinMoin, ich habe hier eine relativ simple Aufgabe...es funktioniert auch alles nur leider zu langsam...vielleicht kann mir einer einen Tip gebe, wie ich das ganze beschleunigen kann... Ich habe 3 Listen: Bsp. List1: a1|b1 c1|d3 e3|i4 ... List2: a1|111 t1|222 e3|555 .... Liste3: w6|666 u8|777 b1|888 .... Ablauf: Durchlaufe Liste1...also:a1|b1 (=1. Linie) Suche a1 in Liste2, wenn gefunden suche b1 in Liste3 und gib jeweils das Pärchen aus, also a1 -> 111, b1 -> 888 Die Listen habe so 20 MB mit ca. 1 Mio Einträge... Ich habe schon einiges rumprobiert, ob es besser ist die Listen komplet einzlesen, oder jeweils zeilenweise durchzugehen... Naja unten ist mein Ergebnis. Leider dauert das ganze immer noch Stunden. Ich bin für jeden Tipp dankbar, wie ich das schneller hinkriege... Vielen Dank und Grüße Frank #!/usr/local/bin/python import string, sys mypath="/user1/daten/test/" linklist_path=mypath+"Link.lis" partlist_path=mypath+part.lis" partlist_ci_path=mypath+part_ci.lis" result_path=mypath+result.lis" partlist=open(partlist_path, "r").readlines() partlist_ci=open(partlist_ci_path, "r").readlines() #len_linklist=len(open(linklist_path, "r").readlines()) result_list=[] len_partlist=len(partlist) file = open(linklist_path, "r") line =file.readline() count = 1 while 1: split1=string.strip(string.split(line, "|")[0]) for my1line in partlist_ci: if split1 == string.split(my1line, "|")[0]: ci=string.strip(string.split(my1line,"|")[1]) print "found ci", ci split2=string.strip(string.split(line,"|")[1]) for my2line in xrange(len_partlist): if split2 == string.split(my2line, "|")[0]: ds=string.strip(string.split(my2line, "|")[1]) # hier sind die Zeile verrutscht... result_list.append(ci+"|"+ds+"\n") break break #print count,len_linklist #count += 1 line=file.readline() if not line:break file.close() result_file = open(result_path, "w") result_file.writelines([x for x in result_list ]) result_file.close() -- COMPUTERBILD 15/03: Premium-e-mail-Dienste im Test -------------------------------------------------- 1. GMX TopMail - Platz 1 und Testsieger! 2. GMX ProMail - Platz 2 und Preis-Qualitätssieger! 3. Arcor - 4. web.de - 5. T-Online - 6. freenet.de - 7. daybyday - 8. e-Post _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Hallo Frank, der Code unten ist wüst formatiert, aber ich denke, ich verstehe das Problem anhand deiner Beschreibung :-) frankimmich@gmx.de wrote:
ich habe hier eine relativ simple Aufgabe...es funktioniert auch alles nur leider zu langsam...vielleicht kann mir einer einen Tip gebe, wie ich das ganze beschleunigen kann...
Ich habe 3 Listen:
Bsp. List1:
a1|b1 c1|d3 e3|i4 ...
List2:
a1|111 t1|222 e3|555 ....
Liste3:
w6|666 u8|777 b1|888 ....
Ablauf: Durchlaufe Liste1...also:a1|b1 (=1. Linie) Suche a1 in Liste2, wenn gefunden suche b1 in Liste3 und gib jeweils das Pärchen aus, also a1 -> 111, b1 -> 888
Zumindest der Lookup in der zweiten und dritten Liste schreit geradezu nach Dictionaries, - vorausgesetzt, die linken Seiten treten nicht mehrfach auf. Da du aber ohnehin nur nach dem ersten Vorkommen der Schlüssel (hier a1 und b1) suchst, ist es effektiv wohl egal, ob diese mehrfach vorkommen. Mit anderen Worten: du solltest die Listen 2 und 3 beim Einlesen (bzw. Erzeugen) in Dictionaries umwandeln bzw. als solche erzeugen, dann gehen die folgenden Lookups mit konstanter Geschwindigkeit, O(1). Aus deiner dargestellten Liste 2 würde also das Dictionary {'a1': '111', 't1': '222', 'e3': '555'} , zu erzeugen mit d = dict( [item.split('|') for item in liste2] ) . Falls du tatsächlich Python 1.5 verwenden willst/musst, kannst du das auch mit map/lambda oder einer expliziten Schleife machen. Ich empfehle dir allerdings, möglichst auf Python 2.x umzusteigen. Viele Grüße Stefan _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Hi, um mit solchen Listen / Dictionaries effizient zu arbeiten, empfiehlt sich kjBuckets (http://starship.python.net/crew/aaron_watters/kjbuckets/kjbuckets.html). Damit kann man solche grossen Datenmengen sehr effizient junctions und solche Dinge machen!! Gruss Simon _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Hallo und schon mal Danke für den Tipp.. ich werde das Montag gleich mal mir Dictionarys ausprobieren.. Entschuldigt auch den schlecht formatierten Code... Das kam alles durch die Kopiererei zwischen Unix und Win... Soll nicht wieder vorkommen... Das mitr python 1.5 kann ich leider nicht ändern.. Danke und schönes WE. Grüße Frank
Hallo Frank,
der Code unten ist wüst formatiert, aber ich denke, ich verstehe das Problem anhand deiner Beschreibung :-)
frankimmich@gmx.de wrote:
ich habe hier eine relativ simple Aufgabe...es funktioniert auch alles nur leider zu langsam...vielleicht kann mir einer einen Tip gebe, wie ich das ganze beschleunigen kann...
Ich habe 3 Listen:
Bsp. List1:
a1|b1 c1|d3 e3|i4 ...
List2:
a1|111 t1|222 e3|555 ....
Liste3:
w6|666 u8|777 b1|888 ....
Ablauf: Durchlaufe Liste1...also:a1|b1 (=1. Linie) Suche a1 in Liste2, wenn gefunden suche b1 in Liste3 und gib jeweils das Pärchen aus, also a1 -> 111, b1 -> 888
Zumindest der Lookup in der zweiten und dritten Liste schreit geradezu nach Dictionaries, - vorausgesetzt, die linken Seiten treten nicht mehrfach auf. Da du aber ohnehin nur nach dem ersten Vorkommen der Schlüssel (hier a1 und b1) suchst, ist es effektiv wohl egal, ob diese mehrfach vorkommen.
Mit anderen Worten: du solltest die Listen 2 und 3 beim Einlesen (bzw. Erzeugen) in Dictionaries umwandeln bzw. als solche erzeugen, dann gehen die folgenden Lookups mit konstanter Geschwindigkeit, O(1).
Aus deiner dargestellten Liste 2 würde also das Dictionary {'a1': '111', 't1': '222', 'e3': '555'} , zu erzeugen mit d = dict( [item.split('|') for item in liste2] ) . Falls du tatsächlich Python 1.5 verwenden willst/musst, kannst du das auch mit map/lambda oder einer expliziten Schleife machen. Ich empfehle dir allerdings, möglichst auf Python 2.x umzusteigen.
Viele Grüße Stefan
-- COMPUTERBILD 15/03: Premium-e-mail-Dienste im Test -------------------------------------------------- 1. GMX TopMail - Platz 1 und Testsieger! 2. GMX ProMail - Platz 2 und Preis-Qualitätssieger! 3. Arcor - 4. web.de - 5. T-Online - 6. freenet.de - 7. daybyday - 8. e-Post _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
participants (3)
-
frankimmich@gmx.de
-
Simon Pamies
-
Stefan Schwarzer