あなたが望むものを達成するための迅速な方法はall
、ジェネレータ内包表記を使用することです。
s_list2 = set(list2)
all_present = all(l in s_list2 for l in list1)
これは、list1 の一部の要素が list2 に存在しない場合に有利です。
いくつかのタイミング。最初のリストのすべての値が 2 番目のリストに含まれている場合:
In [4]: l1 = range(100)
In [5]: l2 = range(1000)
In [6]: random.shuffle(l1)
In [9]: random.shuffle(l2)
In [20]: %timeit s2 = set(l2); all(l in s2 for l in l1)
10000 loops, best of 3: 26.4 us per loop
In [21]: %timeit s1 = set(l1); s2 = set(l2); s1.issubset(s2)
10000 loops, best of 3: 25.3 us per loop
最初のリストの一部の値が2 番目のリストに存在しない場合を見ると、次のようになります。
In [2]: l1 = range(1000)
In [3]: l2 = range(100)
In [4]: random.shuffle(l1)
In [5]: random.shuffle(l2)
In [6]: sl2 = set(l2)
In [8]: %timeit ss = set(l2); set(l1) & ss == ss
10000 loops, best of 3: 27.8 us per loop
In [10]: %timeit s1 = set(l1); s2 = set(l2); s2.issubset(s1)
10000 loops, best of 3: 24.7 us per loop
In [11]: %timeit sl2 = set(l2); all(l in sl2 for l in l1)
100000 loops, best of 3: 3.58 us per loop
この方法のパフォーマンスissubset
は最初のケースの と同等であり、2 番目のケースの方が高速であることがわかります。これは、回路が短絡し、2 つの中間セットを作成する必要がなくなるためです (必要なのは 1 つだけです)。
1 つの大きなリストと 1 つの小さなリストを持つことは、gencomp 法の利点を示しています。
In [7]: l1 = range(10)
In [8]: l2 = range(10000)
In [9]: %timeit sl2 = set(l2); all(l in sl2 for l in l1)
1000 loops, best of 3: 230 us per loop
In [10]: %timeit sl1 = set(l1); all(l in sl1 for l in l2)
1000000 loops, best of 3: 1.45 us per loop
In [11]: %timeit s1 = set(l1); s2 = set(l2); s1.issubset(s2)
1000 loops, best of 3: 228 us per loop
In [12]: %timeit s1 = set(l1); s2 = set(l2); s2.issubset(s1)
1000 loops, best of 3: 228 us per loop