@ EriF89'u göstermek için yeni bir test seti onca yıl sonra hala geçerli:
$ 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
Burada bazı kullanım durumlarında daha tuple
hızlı olduğu bilinen lists
(ve daha az bellek kullanan) a'yı karşılaştırıyoruz. Arama tablosu durumunda,tuple
daha iyi sonuç vermedi.
Hem dict
veset
çok iyi performans. Bu, benzersizlik hakkında @SilentGhost yanıtına ilginç bir nokta getiriyor: OP'nin bir veri kümesinde 10M değerleri varsa ve bunların içinde yinelenmeler olup olmadığı bilinmiyorsa, öğelerinin bir kümesini / dikteğini paralel tutmaya değer gerçek veri setiyle ve bu set / dikte varlığını test ederek. 10M veri noktalarının sadece 10 benzersiz değere sahip olması mümkündür, bu da aramak için çok daha küçük bir alandır!
SilentGhost'un dicts hakkındaki hatası aslında aydınlatıcıdır, çünkü biri yinelenen verileri (değerlerde) çoğaltılmamış bir kümeyle (anahtarlar) ilişkilendirmek ve böylece bir veri nesnesini tüm verileri tutmak için tutabilir, ancak yine de bir arama tablosu olarak hızlı olabilir. Örneğin, bir dikte anahtarı aranan değer olabilir ve değer, bu değerin oluştuğu hayali bir listedeki dizinlerin bir listesi olabilir.
Örneğin, aranacak kaynak veri listesi l=[1,2,3,1,2,1,4]
olsaydı, bu dikteyle değiştirilerek hem arama hem de bellek için optimize edilebilir:
>>> 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]})
Bu dikte ile kişi şunu bilebilir:
- Orijinal veri kümesinde bir değer varsa (yani
2 in d
döndürür True
)
- Burada değeri ilk veri kümesi (yani
d[2]
veriler orijinal veri listesinde bulunmuştur indekslerinin listesine verir: [1, 4]
)