วิธีการทั่วไป:
def checkEqual1(iterator):
iterator = iter(iterator)
try:
first = next(iterator)
except StopIteration:
return True
return all(first == rest for rest in iterator)
หนึ่งในสายการบิน:
def checkEqual2(iterator):
return len(set(iterator)) <= 1
อีกหนึ่งซับ:
def checkEqual3(lst):
return lst[1:] == lst[:-1]
ความแตกต่างระหว่าง 3 เวอร์ชันคือ:
- ใน
checkEqual2
เนื้อหาจะต้องแฮช
checkEqual1
และcheckEqual2
สามารถใช้ตัววนซ้ำใด ๆ ได้ แต่checkEqual3
ต้องป้อนลำดับตามลำดับโดยทั่วไปแล้วจะเป็นคอนเทนเนอร์คอนกรีตเช่นรายการหรือทูเปิล
checkEqual1
หยุดทันทีที่พบความแตกต่าง
- เนื่องจาก
checkEqual1
มีรหัส Python มากกว่าจึงมีประสิทธิภาพน้อยกว่าเมื่อมีหลายรายการที่เท่ากันในตอนเริ่มต้น
- เนื่องจาก
checkEqual2
และcheckEqual3
ดำเนินการคัดลอก O (N) เสมอพวกเขาจะใช้เวลานานขึ้นหากข้อมูลส่วนใหญ่ของคุณจะส่งกลับค่าเท็จ
- สำหรับ
checkEqual2
และcheckEqual3
มันเป็นเรื่องยากที่จะปรับตัวเข้ากับการเปรียบเทียบจากไปa == b
a is b
timeit
ผลลัพธ์สำหรับ Python 2.7 และ (เฉพาะ s1, s4, s7, s9 ควรกลับ True)
s1 = [1] * 5000
s2 = [1] * 4999 + [2]
s3 = [2] + [1]*4999
s4 = [set([9])] * 5000
s5 = [set([9])] * 4999 + [set([10])]
s6 = [set([10])] + [set([9])] * 4999
s7 = [1,1]
s8 = [1,2]
s9 = []
เราได้รับ
| checkEqual1 | checkEqual2 | checkEqual3 | checkEqualIvo | checkEqual6502 |
|-----|-------------|-------------|--------------|---------------|----------------|
| s1 | 1.19 msec | 348 usec | 183 usec | 51.6 usec | 121 usec |
| s2 | 1.17 msec | 376 usec | 185 usec | 50.9 usec | 118 usec |
| s3 | 4.17 usec | 348 usec | 120 usec | 264 usec | 61.3 usec |
| | | | | | |
| s4 | 1.73 msec | | 182 usec | 50.5 usec | 121 usec |
| s5 | 1.71 msec | | 181 usec | 50.6 usec | 125 usec |
| s6 | 4.29 usec | | 122 usec | 423 usec | 61.1 usec |
| | | | | | |
| s7 | 3.1 usec | 1.4 usec | 1.24 usec | 0.932 usec | 1.92 usec |
| s8 | 4.07 usec | 1.54 usec | 1.28 usec | 0.997 usec | 1.79 usec |
| s9 | 5.91 usec | 1.25 usec | 0.749 usec | 0.407 usec | 0.386 usec |
บันทึก:
# http://stackoverflow.com/q/3844948/
def checkEqualIvo(lst):
return not lst or lst.count(lst[0]) == len(lst)
# http://stackoverflow.com/q/3844931/
def checkEqual6502(lst):
return not lst or [lst[0]]*len(lst) == lst
a == b
หรือเหมือนกันในขณะที่a is b
?