ฉันคิดว่ามันน่าสนใจที่จะชี้ให้เห็นว่าวิธีใดเร็วที่สุดและในสถานการณ์ใด:
นี่คือการทดสอบบางอย่างที่ฉันใช้ (ใน MacBook Pro 2012)
>>> def method1(list,search_age):
... for name,age in list.iteritems():
... if age == search_age:
... return name
...
>>> def method2(list,search_age):
... return [name for name,age in list.iteritems() if age == search_age]
...
>>> def method3(list,search_age):
... return list.keys()[list.values().index(search_age)]
ผลลัพธ์จากprofile.run()
ในแต่ละวิธี 100,000 ครั้ง:
วิธีที่ 1:
>>> profile.run("for i in range(0,100000): method1(list,16)")
200004 function calls in 1.173 seconds
วิธีที่ 2:
>>> profile.run("for i in range(0,100000): method2(list,16)")
200004 function calls in 1.222 seconds
วิธีที่ 3:
>>> profile.run("for i in range(0,100000): method3(list,16)")
400004 function calls in 2.125 seconds
ดังนั้นนี่แสดงให้เห็นว่าสำหรับ dict ขนาดเล็กวิธีที่ 1 นั้นเร็วที่สุด นี่เป็นไปได้มากที่สุดเพราะมันจะส่งคืนการแข่งขันครั้งแรกเมื่อเทียบกับการแข่งขันทั้งหมดเช่นวิธีที่ 2 (ดูหมายเหตุด้านล่าง)
ที่น่าสนใจคือทำการทดสอบแบบเดียวกันกับ dict ที่ฉันมีด้วย 2,700 รายการฉันได้รับผลลัพธ์ที่แตกต่างกันมาก (คราวนี้เรียกใช้ 10,000 ครั้ง):
วิธีที่ 1:
>>> profile.run("for i in range(0,10000): method1(UIC_CRS,'7088380')")
20004 function calls in 2.928 seconds
วิธีที่ 2:
>>> profile.run("for i in range(0,10000): method2(UIC_CRS,'7088380')")
20004 function calls in 3.872 seconds
วิธีที่ 3:
>>> profile.run("for i in range(0,10000): method3(UIC_CRS,'7088380')")
40004 function calls in 1.176 seconds
ดังนั้นนี่คือวิธีที่ 3 เป็นมากได้เร็วขึ้น เพียงไปเพื่อแสดงขนาดของ dict ของคุณจะมีผลต่อวิธีการที่คุณเลือก
หมายเหตุ: วิธีที่ 2 ส่งคืนรายการของชื่อทั้งหมดในขณะที่วิธีที่ 1 และ 3 ส่งคืนเฉพาะการจับคู่ครั้งแรก ฉันไม่ได้พิจารณาการใช้งานหน่วยความจำ ฉันไม่แน่ใจว่าวิธีที่ 3 สร้าง 2 รายการพิเศษ (คีย์ () และค่า ()) และเก็บไว้ในหน่วยความจำ