2016-06-28 13 views
0

Ich habe eine lange (viele Millionen) Liste von Transaktionen in der Form [account_id, transactiontyp, Daten], jedes Konto hat viele Transaktionen. Ich möchte alle Transaktionen für eine bestimmte Kurzliste (ca. 20000) von Konten auswählen. Beispiel:Python wählen Sublist effektiv

longlist=[['a','t1',5],['a','t1',9],['b','t1',3],['c','t5',8]] 

shortlist=['a','c'] 

Der folgende Code funktioniert der Trick, aber es ist extrem langsam:

selection=[sel for sel in longlist if sel[0] in shortlist] 

Es muss schnellere Wege, das zu erreichen? Ich habe versucht,

def select_sample(longlist,shortlist): 
    ret=[] 
    for elem in longlist: 
     if elem[0] in shortlist: 
      ret.append(elem) 
    return ret 

zu sehen, wie es skaliert, wie erwartet sie linear in der Größe von Longlist ist. Longlist ist nach account_id sortiert. Ich habe keinen eindeutigen Schlüssel in der Longlist, um Wörterbücher zu verwenden. Gibt es so etwas wie eine Index-Technik, die ich verwenden könnte?

+0

Sie können die binäre Suche für einzelne Konten verwenden [siehe Dokumentation] (https://docs.python.org/2/library/bisect.html#searching-sorted-lists), aber dann müssen Sie das für jedes Konto ausführen . Ich denke, dass es etwas besseres geben sollte. – syntonym

+0

können Sie mit Generatoren versuchen –

+2

Nicht ganz eine vollständige Lösung, aber in Betracht ziehen, eine 'set' anstelle einer Liste zu verwenden, um zu überprüfen:' shortset = set (shortlist) 'und' sel [0] shortset'. –

Antwort

3

Mit set (shortlist = set(['a', 'c']) würde ein Break-Even bei rund Konten. Ich würde erwarten, dass es mindestens 2 Jahrzehnte schneller ist, wenn shortlist 20k Accounts hat.

Wenn diese Auswahl viele Male wiederholt wird, profitieren Sie von sogar mehr, indem Sie ein Wörterbuch verwenden, das den Kontonamen der Liste der Transaktionen für diesen bestimmten Account zuordnet.


Allerdings riecht alles wie ein XY-Problem. Sicher sollten Sie ein RDBMS verwenden, um diese Daten zu verwalten? Sie haben effiziente Algorithmen, um genau diese Art von Abfragen zu bearbeiten.

+0

Danke, das löst das Problem jetzt. Ich würde mich über einen Hinweis/Link freuen, um zu verstehen: Warum macht das einen Unterschied? Ist Python für jede Beobachtung über die Shortlist gesetzt? – Rriskit

+1

Ja. Siehe [Zeitkomplexität] (https://wiki.python.org/moin/TimeComplexity), die Zeit, die für "x in s" aufgewendet wird, wächst linear für die Liste und ist konstant für die Menge, wenn sie in der Größe wächst. –