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?
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
können Sie mit Generatoren versuchen –
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'. –