เนื่องจากชุดการทดสอบใหม่ที่จะแสดง @ EriF89 ยังคงอยู่หลังจากผ่านไปหลายปี:
$ 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
ที่นี่เราเปรียบเทียบ a tuple
ซึ่งทราบกันว่าเร็วกว่าlists
(และใช้หน่วยความจำน้อยกว่า) ในบางกรณี ในกรณีของตารางการค้นหาtuple
faired ไม่ดี
ทั้งสองdict
และset
ทำได้ดีมาก สิ่งนี้จะนำมาซึ่งประเด็นที่น่าสนใจที่ผูกไว้กับ @SilentGhost คำตอบเกี่ยวกับความเป็นเอกลักษณ์: ถ้า OP มีค่า 10M ในชุดข้อมูลและไม่ทราบว่ามีการทำซ้ำในพวกเขาหรือไม่ ด้วยชุดข้อมูลจริงและทดสอบการมีอยู่ในชุด / dict นั้น เป็นไปได้ว่าจุดข้อมูล 10M มีค่าเฉพาะ 10 ค่าซึ่งเป็นพื้นที่ที่เล็กกว่ามากในการค้นหา!
ความผิดพลาดของ SilentGhost เกี่ยวกับ dicts กำลังส่องสว่างเพราะสามารถใช้ dict เพื่อเชื่อมโยงข้อมูลที่ซ้ำกัน (เป็นค่า) ลงในชุด (คีย์) ที่ไม่ซ้ำซ้อนดังนั้นจึงเก็บวัตถุข้อมูลหนึ่งไว้เพื่อเก็บข้อมูลทั้งหมด แต่ยังคงเร็วเหมือนตารางค้นหา ตัวอย่างเช่นคีย์ dict อาจเป็นค่าที่ถูกค้นหาและค่าอาจเป็นรายการดัชนีในรายการจินตภาพที่ค่านั้นเกิดขึ้น
ตัวอย่างเช่นหากรายการแหล่งข้อมูลที่จะค้นหาl=[1,2,3,1,2,1,4]
ก็สามารถปรับให้เหมาะสมสำหรับการค้นหาและหน่วยความจำโดยแทนที่ด้วย dict นี้:
>>> 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]})
ด้วย dict นี้คุณสามารถรู้:
- ถ้าค่าอยู่ในชุดข้อมูลดั้งเดิม (เช่น
2 in d
ส่งคืนTrue
)
- โดยที่ค่านั้นอยู่ในชุดข้อมูลดั้งเดิม (เช่น
d[2]
ส่งคืนรายการดัชนีที่พบข้อมูลในรายการข้อมูลดั้งเดิม[1, 4]
)