Nur jeder verwenden:
if any(myvar in x for x in (r,s,t))
Satz Lookups 0(1)
so eine Union zu schaffen, in jedem Satz zu überprüfen, ob die Variable ist völlig unnötig ist anstatt einfach in
mit any
zu überprüfen, was einen Kurzschluss verursacht, sobald eine Übereinstimmung gefunden wird, und keinen neuen Satz erstellt.
Und ich frage mich auch, wenn diese Verbindung irgendwie Leistung beeinflussen
Ja natürlich unioning die Sätze beeinflusst die Leistung, es auf die Komplexität hinzufügt, werden Sie jedes Mal einen neuen Satz zu schaffen, die O(len(r)+len(s)+len(t))
ist, so dass Sie kann sich von dem wirklichen Punkt verabschieden, Sets zu verwenden, die effiziente Lookups sind.
So lautet das Fazit ist, dass es Ihnen eine effiziente Lookups behalten möchten Sie den Satz einmal Vereinigung haben und sie in Erinnerung behalten eine neue Variable zu schaffen dann, dass mit Ihrer Suche für myvar
so die anfängliche Schöpfung sein zu tun 0(n)
und Lookups werden danach 0(1)
sein.
Wenn Sie nicht jedes Mal, wenn Sie eine Suche zuerst die Vereinigung erstellen möchten, haben Sie eine lineare Lösung in der Länge von r+s+t -> set.union(*(r, s, t))
im Gegensatz zu im schlimmsten Fall drei konstante (im Durchschnitt) Lookups. Das bedeutet auch immer Elemente aus dem neuen unioned set hinzuzufügen oder zu entfernen, die aus r,s
oder t
hinzugefügt/entfernt werden.
Einige realistische Timings auf mäßig großformatigen Sätze zeigen genau den Unterschied:
In [1]: r = set(range(10000))
In [2]: s = set(range(10001,20000))
In [3]: t = set(range(20001,30000))
In [4]: timeit any(29000 in st for st in (r,s,t))
1000000 loops, best of 3: 869 ns per loop
In [5]: timeit 29000 in r | s | t
1000 loops, best of 3: 956 µs per loop
In [6]: timeit 29000 in reduce(lambda x,y :x.union(y),[r,s,t])
1000 loops, best of 3: 961 µs per loop
In [7]: timeit 29000 in r.union(s).union(t)
1000 loops, best of 3: 953 µs per loop
die Vereinigung zeigt Zeit, dass so ziemlich die ganze Zeit in der Union Anrufe ausgegeben:
In [8]: timeit r.union(s).union(t)
1000 loops, best of 3: 952 µs per loop
größer Verwendung Setzt und holt das Element in den letzten Satz:
In [15]: r = set(range(1000000))
In [16]: s = set(range(1000001,2000000))
In [17]: t = set(range(2000001,3000000))
In [18]: timeit any(2999999 in st for st in (r,s,t))
1000000 loops, best of 3: 878 ns per loop
In [19]: timeit 2999999 in reduce(lambda x,y :x.union(y),[r,s,t])
1 loops, best of 3: 161 ms per loop
In [20]: timeit 2999999 in r | s | t
10 loops, best of 3: 157 ms per loop
Es gibt l iterally kein Unterschied, egal wie groß die Sätze werden mit any
aber wie die eingestellten Größen wächst auch die Laufzeit mit Union.
Der einzige Weg, um es schneller zu or
halten wäre, aber wir den Unterschied von einigen hundert Nanosekunden einnehmen, die die Kosten für die Erstellung des Generators Ausdruck und den Funktionsaufruf ist:
In [22]: timeit 2999999 in r or 2999999 in s or 2999999 in t
10000000 loops, best of 3: 152 ns per loop
zu Vereinigungsmengen set.union (* (r, s, t)) ist auch die schnellsten, wie Sie bauen keine Vermittler-Sets:
In [47]: timeit 2999999 in set.union(*(r,s,t))
10 loops, best of 3: 108 ms per loop
In [49]: r | s | t == set.union(*(r,s,t))
Out[49]: True
Ich kenne den Titel „Wie kann man überprüfen, ob ein Wert vorhanden ist, in einem gegebenen Mengen“ ein bisschen komisch klingt. Wenn jemand eine bessere Möglichkeit sieht, es zu schreiben, können Sie es gerne bearbeiten! – fedorqui