[Python-de] such performance optimieren ???

Stefan Schwarzer sschwarzer at sschwarzer.net
Don Aug 28 22:46:45 CEST 2003


Hallo Frank,

der Code unten ist wüst formatiert, aber ich denke, ich
verstehe das Problem anhand deiner Beschreibung :-)

frankimmich at 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