รหัส...
options.get(something, doThisMostOfTheTime)()
... ดูเหมือนว่ามันควรจะเร็วขึ้น แต่จริง ๆ แล้วมันช้ากว่าif
... elif
... else
สร้างเพราะมีการเรียกฟังก์ชั่นซึ่งจะมีค่าใช้จ่ายในการปฏิบัติงานที่สำคัญในห่วงคับ
ลองพิจารณาตัวอย่างเหล่านี้ ...
1.py
something = 'something'
for i in xrange(1000000):
if something == 'this':
the_thing = 1
elif something == 'that':
the_thing = 2
elif something == 'there':
the_thing = 3
else:
the_thing = 4
2.py
something = 'something'
options = {'this': 1, 'that': 2, 'there': 3}
for i in xrange(1000000):
the_thing = options.get(something, 4)
3.py
something = 'something'
options = {'this': 1, 'that': 2, 'there': 3}
for i in xrange(1000000):
if something in options:
the_thing = options[something]
else:
the_thing = 4
4.py
from collections import defaultdict
something = 'something'
options = defaultdict(lambda: 4, {'this': 1, 'that': 2, 'there': 3})
for i in xrange(1000000):
the_thing = options[something]
... และจดระยะเวลา CPU ที่ใช้ ...
1.py: 160ms
2.py: 170ms
3.py: 110ms
4.py: 100ms
... โดยใช้เวลาผู้ใช้จากtime(1)
.
ตัวเลือก # 4 มีค่าใช้จ่ายของหน่วยความจำเพิ่มเติมในการเพิ่มรายการใหม่สำหรับการพลาดคีย์ที่แตกต่างกันทุกครั้งดังนั้นหากคุณคาดหวังว่าจะมีจำนวนคีย์ที่แตกต่างกันไม่ถูก จำกัด ฉันจะใช้ตัวเลือก # 3 ซึ่งยังคงเป็นการปรับปรุงที่สำคัญใน โครงสร้างดั้งเดิม
sort
ใช้สิ่งที่คุณกำลังเรียกใช้ if / else ... chain ได้หรือไม่เพื่อให้องค์ประกอบทั้งหมดที่เงื่อนไขข้อใดข้อหนึ่งตรงกันนั้นอยู่ที่ปลายด้านหนึ่งและส่วนที่เหลือทั้งหมดอยู่ที่อีกด้านหนึ่งหรือไม่? ถ้าเป็นเช่นนั้นคุณสามารถดูได้ว่าเร็วขึ้น / สง่างามมากขึ้นหรือไม่ แต่โปรดจำไว้ว่าหากไม่มีปัญหาด้านประสิทธิภาพก็ยังเร็วเกินไปที่จะกังวลเกี่ยวกับการเพิ่มประสิทธิภาพ