Sebagai rangkaian tes baru untuk menunjukkan @ EriF89 masih tepat setelah bertahun-tahun:
$ python -m timeit -s "l={k:k for k in xrange(5000)}" "[i for i in xrange(10000) if i in l]"
1000 loops, best of 3: 1.84 msec per loop
$ python -m timeit -s "l=[k for k in xrange(5000)]" "[i for i in xrange(10000) if i in l]"
10 loops, best of 3: 573 msec per loop
$ python -m timeit -s "l=tuple([k for k in xrange(5000)])" "[i for i in xrange(10000) if i in l]"
10 loops, best of 3: 587 msec per loop
$ python -m timeit -s "l=set([k for k in xrange(5000)])" "[i for i in xrange(10000) if i in l]"
1000 loops, best of 3: 1.88 msec per loop
Di sini kami juga membandingkan a tuple, yang diketahui lebih cepat daripada lists(dan menggunakan lebih sedikit memori) dalam beberapa kasus penggunaan. Dalam hal tabel pencarian, tuplefaired tidak lebih baik.
Baik itu dictdan setdilakukan dengan sangat baik. Ini memunculkan poin menarik yang mengaitkan jawaban @ SilentGhost tentang keunikan: jika OP memiliki nilai 10M dalam kumpulan data, dan tidak diketahui jika ada duplikat di dalamnya, maka ada baiknya menjaga set / dikt elemen-elemennya secara paralel. dengan set data aktual, dan pengujian untuk keberadaan dalam set / dikt itu. Mungkin saja 10M titik data hanya memiliki 10 nilai unik, yang merupakan ruang yang jauh lebih kecil untuk mencari!
Kesalahan SilentGhost tentang dicts sebenarnya menerangi karena seseorang dapat menggunakan dict untuk mengkorelasikan data duplikat (dalam nilai) ke dalam set (kunci) yang tidak ter-duplikasi, dan dengan demikian menyimpan satu objek data untuk menyimpan semua data, namun masih secepat tabel pencarian. Misalnya, kunci dict dapat berupa nilai yang dicari, dan nilai tersebut dapat berupa daftar indeks dalam daftar imajiner tempat nilai tersebut terjadi.
Misalnya, jika daftar data sumber yang akan dicari adalah l=[1,2,3,1,2,1,4], itu bisa dioptimalkan untuk pencarian dan memori dengan menggantinya dengan dict ini:
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> l=[1,2,3,1,2,1,4]
>>> for i, e in enumerate(l):
... d[e].append(i)
>>> d
defaultdict(<class 'list'>, {1: [0, 3, 5], 2: [1, 4], 3: [2], 4: [6]})
Dengan dikt ini, orang bisa tahu:
- Jika suatu nilai berada dalam dataset asli (yaitu
2 in dpengembalian True)
- Di mana nilai itu dalam dataset asli (yaitu
d[2]mengembalikan daftar indeks dimana data ditemukan dalam daftar data asli: [1, 4])